Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Перегрузка оператора “+” в шаблоне

#cpp #ооп #шаблоны_с++


Здравствуйте. Столкнулся с проблемой: не могу правильно перегрузить оператор сложения
в шаблоне класса. Может кто показать мне мою ошибку? Тип данных массива в шаблоне может
быть char,int, float, double. Должно поддерживаться сложение разных типов данных (т.е.
если первый объект с параметром int, а второй - с параметром double, то метод должен
возвращать объект с параметром double).

#pragma once
template 
class Vector
{
    T *data;
    size_t size;
public:
    Vector();
    Vector(size_t size);
    ~Vector();
    size_t getSize();
    void SetAll();
    void ClearAll();
    void SetVectorSize(size_t);
    T operator [](int);
    template< typename U >
    Vector & operator+(Vector  &B);
};


cpp файл:

#include "stdafx.h"
#include "Vector.h"
#include 
#include 
...
...
template
template
inline Vector & Vector::operator+(Vector& B)
{
    if (sizeof(this->data[0]) > sizeof(B.data[0]))
    {
        Vector  obj;
    }
    else
    {
        Vector  obj;
    }
    obj.data[0] = 1;
    return obj;
}

    


Ответы

Ответ 1



Если я верно понял, что вы хотите, то решение примерно такое - template Vector> operator+(const Vector&) const { Vector> x; // складываете, как вам надо ....... return x; } Код Vector a; Vector b; auto c = a+b; cout << typeid(c).name() << endl; даст Vector. И еще - вы должны объявить этот оператор как возвращающий вектор нового типа, а не ссылку - иначе вы по сути вынуждены возвращать ссылку на свой объект, а его тип предопределен. Update В принципе, можно как-то так - но, как мне кажется, это будет совсем не так красиво: template auto operator+(const Vector&A) const { Vector x; return x; } Т.е. даем компилятору самому решить, какой тип имеет сумма, и этот тип используем для типа возвращаемого значения.

Ответ 2



Например, вот так (C++11): #include template class Vector; template class Vector::value || std::is_floating_point::value>::type> { T *data; size_t size; public: Vector(){}; Vector(size_t _size) : size(_size){} ~Vector(){} size_t getSize(); void SetAll(); void ClearAll(); void SetVectorSize(size_t); T operator [](int); Vector operator+ (Vector& B) { return Vector(size + B.size); } }; int main() { Vector a; Vector b; a + b; return 0; }

Комментариев нет:

Отправить комментарий