Sto cercando di sovraccaricare l'operatore < < come amico per una classe template Pair, ma continuo a ricevere un avviso del compilatore dicendooperatore amico Sovraccarico << per classe template
friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function
per questo codice:
friend ostream& operator<<(ostream&, Pair<T,U>&);
dà un secondo avvertimento come una raccomandazione dicendo
if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
Ecco la definizione della funzione
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
out << v.val1 << " " << v.val2;
}
e qui è l'intera classe.
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;
};
non ero sicuro di quello di attingere l'avviso raccomandazione, diverso da quello che forse devo mettere da qualche parte nella dichiarazione amico. Qualcuno conosce la sintassi corretta per questo? Grazie.
+1 Questo è in realtà ciò che il compilatore si lamenta. L'altra risposta affronta il problema con una soluzione alternativa: invece di dire al compilatore che l'amico è la specializzazione del modello, crea una funzione operatore << non basata su un modello per i tipi specificati. –
Sono d'accordo con David; questa è la soluzione migliore in termini di best practice e buona programmazione. – Andry
Wow, l'extra '<>' è facile da perdere! – Nick