Estoy tratando de sobrecargar el operador < < como amigo a una clase de plantilla par, pero me siguen dando una advertencia del compilador diciendooperador amigo << La sobrecarga de clase de plantilla
friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function
para este código:
friend ostream& operator<<(ostream&, Pair<T,U>&);
da una segunda advertencia como una recomendación diciendo
if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
Aquí es la definición de la función
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
out << v.val1 << " " << v.val2;
}
y aquí está toda la clase.
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream&, Pair<T,U>&);
private:
T val1;
U val2;
};
No estaba seguro de qué sacar de la advertencia de recomendación, aparte de que tal vez tengo que ponerlo en algún lugar de la declaración de amigo. ¿Alguien sabe la sintaxis adecuada para esto? Gracias.
+1 Esto es en realidad lo que el compilador se queja. La otra respuesta trata el problema con una solución temporal: en lugar de decirle al compilador que el amigo es la especialización de la plantilla, crea una función << de operador sin plantilla para los tipos dados. –
Estoy de acuerdo con David; esta es la mejor solución en términos de mejores prácticas y buena programación. – Andry
¡Guau, el ''> extra es fácil de perder! – Nick