2016-05-16 10 views
0

ich in meiner Klasse Set zwei Templat überladene Freund Funktionen haben, die den Fehlerundefined reference to all friend-Funktionen

Templatedriver.cpp:(.text+0x2a0): undefined reference to `std::ostream& operator<< <int>(std::ostream&, Set<int> const&)' 

und

Templatedriver.cpp:(.text+0x2dd): undefined reference to `std::ostream& operator<< <int>(std::ostream&, Set<int> const&)' 

und so weiter immer zurückschicken (einfaches Ändern der heraus für double, char, etc.) ich diese gesucht und die häufigste Antwort auf hier ist eine vorwärts-Deklaration zu tun, dann als Freund in der Klasse zu erklären, ich habe dies getan, und immer noch einen nicht definierten Referenz

dies ist meine Vorwärtsdeklaration

template <class T> istream& operator>>(istream&, Set<T>&); 
template <class T> ostream& operator<<(ostream&, const Set<T>&); 

und ich erkläre sie in ihnen in der Klasse als solche

template <class T> 
class Set { 

friend istream& operator>> <>(istream&, Set<T>&); 
template <class Y> */friend ostream& operator<< <>(ostream&, const Set<T>&); 
....//rest of class 
} 

und das sind die Definitionen

template <class T> istream& operator>>(istream& is, Set<T>& S){ 
    S.input(); 
    return(is); 
} 


template <class T> ostream& operator<<(ostream& os, const Set<T>& S){ 
     S.display(); 
     return(os); 
} 

ein paar mehr überladenen Klassen Theres Ich habe Probleme mit, aber es ist das gleiche Problem

+0

die Definitionen in der Header-Datei sind? – immibis

+0

immibis Frage ist wichtig. Wenn Ihre Instanz von 'Set ' die Operatoren 'operator <<' und 'operator >>' nicht sehen kann, werden sie niemals instanziiert. – md5i

+0

nein, die Definitionen sind in Set.cpp sollten sie dann in der Header-Datei sein? –

Antwort

0

In Set, ich glaube, Sie einen Templat-Freund Erklärung verwenden möchten:

template <typename T> 
friend istream& operator>> (istream&, Set<T>&); 

Dies erklärt, dass jede Funktion, die nach dem Template-Parameter Substitution passt ein Freund der Klasse ist.

(Sie fast die gehabt haben kann, aber ich wurde von den */ im Code verwechselt. Es genügt zu sagen, dass Sie die <> entfernen sollten.)

+0

ah verdammt, ich wollte das hier löschen, das Zeug direkt vor dem */sollte nicht da sein und ich habe das an einem Punkt getan und es hat nicht funktioniert –