Проблема с вашим оператором + в том, что у вас есть 3 параметра шаблона, один для типа возвращаемого значения и для приведения, но компилятор не может автоматически разрешить этот параметр.
Вы также фиксируетеЕсть несколько зол с приведениями.
Вы можете воспользоваться тем, что если вы определите operator + как свободную шаблонную функцию в вашем пространстве имен , это будет иметь эффект только для типов, определенных в этом пространстве имен.
В пределах вашего пространства имен, поэтому я определю, используя только T и U
template< typename T >
T operator+( const T & t1, const T& t2 )
{
T t( t1 );
t += t2; // defined within T in your namespace
return t;
}
template< typename T, typename U >
T operator+( const T& t, const U& u )
{
return t + T(u);
}
template< typename T, typename U >
T operator+( const U& u, const T& t )
{
return T(u) + t;
}
a + b в общем случае не охватывается этим шаблоном, если только один из типов a и b не находится впространство имен, в котором был определен шаблон.