Используйте два параметра шаблона:
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);
}
Познакомьтесь с типом трейлинг-возврата здесь: