Бинарный оператор для другой версии класса шаблона - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть шаблон класса Point2D, и мне нужно реализовать бинарный оператор для другой версии класса шаблона.Этот код не компилируется из-за проблемы с operator+

template <class T>
class Point2D
{
public:
    T x;
    T y;
    Point2D(T _x=0,T _y=0):x(_x),y(_y)
    {
    }
    Point2D(Point2D& ob)
    {
        x=ob.x;
        y=ob.y;
    }
    template <class T1>
    Point2D(Point2D<T1>& ob)
    {
        x=ob.x;
        y=ob.y;
    }
};
template <class T>
Point2D<T> operator+(const Point2D<T>& ob1,const Point2D<T>& ob2)
{
    return Point2D<T>(ob1.x+ob2.x,ob1.y+ob2.y);
}
int main()
{
    Point2D<int> ob1(10,10);
    Point2D<double> ob2(20,20);
    Point2D<double> ob3=ob2+ob1;
    return 0;
}

Я хочу включить такую ​​функцию Point2D<double> ob3=ob2+ob1;, но компилятор не может определить правильную версию этого оператора Point2D<T> operator+(const Point2D<T>& ob1,const Point2D<T>& ob2) Что я должен изменить длязаставить его работать?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Используйте два параметра шаблона:

template <class T1, class T2>
Point2D<T1> operator+(const Point2D<T1>& ob1,const Point2D<T2>& ob2)
{
    return Point2D<T1>(ob1.x+ob2.x,ob1.y+ob2.y);
}

Это минимальное изменение, чтобы сделать компилятор счастливым.

Однако, как видите, тип результата создается с T1 в качестве типа аргумента шаблона, что может быть нежелательно. Поэтому вам нужно выбрать лучший тип, который желателен для вашей работы. И это связано с метапрограммированием.

В C ++ 11 это действительно просто, с завершающим типом возврата:

template <class T1, class T2>
auto operator+(const Point2D<T1>& ob1,const Point2D<T2>& ob2) -> Point2D<decltype(obj1.x+obj2.x)>
{
    typedef decltype(obj1.x+obj2.x) R;
    return Point2D<R>(ob1.x+ob2.x,ob1.y+ob2.y);
}

Познакомьтесь с типом трейлинг-возврата здесь:

1 голос
/ 11 декабря 2011

Вам необходимо использовать два разных аргумента шаблона, например:

template <typename T, typename U>
Point2D<T> operator+(const Point2D<T>& ob1, const Point2D<U>& ob2)
{
    return Point2D<T>(ob1.x+ob2.x,ob1.y+ob2.y);
}

Или с common_type:

template <typename T, typename U>
Point2D<typename std::common_type<T, U>::type>
operator+(const Point2D<T>& ob1, const Point2D<U>& ob2)
{
    return Point2D<typename std::common_type<T, U>::type>(
        ob1.x+ob2.x,ob1.y+ob2.y
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...