Ciao a tutti,
un codice di questo tipo dà warning (friend declaration declares a non-template function) che indica che la funzione friend non è un template.
codice:
 
template<class T> class Test {
    friend ostream& operator<<(ostream& os, const Test<T>& t);
}
La soluzione che ho scritto io è questa e funziona (dichiara la funzione un template):
codice:
 
template<class U> ostream& operator<<(ostream& os, const Test<U>& t) {
    /* fa qualcosa */
    return os;
}

template<class T> class Test {
    template<class U> friend ostream& operator<<(ostream& os, const Test<U>& t);
}
Ma girando in rete ho trovato anche questa:
codice:
template<class T> class Test {
    friend ostream& operator<<(ostream& os, const Test& t) {
        /* fa qualcosa */
        return os;
    }
};
E non mi è chiaro come possa funzionare. In base a ciò che so non dovrebbe essere un template e quindi non funzionare, ma a quanto pare sì. Qualcuno mi sa spiegare perché?
Quale delle due è preferibile usare e perché?

Grazie in anticipo.