Los operadores binarios deberían estar declarados como miembros "friend" de la clase afectada. Esto permite, por ejemplo, que las operaciones puedan ser simétricas, es decir, se puedan intercambiar los dos elementos que rodean la operación sin penalizaciones:
Código C++:
Ver originalclass POO
{
friend POO operator+( const POO& ar_poo, int numero );
friend POO operator+( int numero, const POO& ar_poo );
}
POO operator+( const POO& ar_poo, int numero )
{
// ...
}
POO operator+( int numero, const POO& ar_poo )
{
// ...
}
// ...
int main( )
{
POO poo;
// ambas operaciones son válidas:
poo = poo + 4;
poo = 4 + poo;
}
Lo anterior es un comentario en voz alta acorde con el tema que estás tocando.
Tu código la verdad es que es un poco confuso... no suele tener demasiado sentido que hagas un template y que dicho template devuelva una versión especializada de sí mismo... los templates, debido a que no se comportan exactamente con lo haría una clase, debes tratarlos con cierto respeto.
Si quieres realizar operaciones que devuelvan templates especializados deberías meter dichas operaciones en funciones externas al template.