2016-06-12 17 views
3

Was ist der Unterschied zwischen der Rückgabe von *this und this aus einer Vorlagenfunktion, die Objekt als Referenz zurückgibt? Beide Optionen kompilieren ohne Probleme in VS2013;Rückgabe anhand der Vorlage

Der Code ist so etwas wie

template <typename T> 
class MyClass 
{ 

public: 
    MyClass(){ } 
    ~MyClass(); 

    MyClass& operator=(const MyClass&); 

}; 

template <typename T> 
MyClass<T>& MyClass<T>::operator=(const MyClass& s_from) 
{ 

    //do some work 
    return *this; 
    //also works 
    //return this 
} 

template <typename T> 
MyClass<T>::~MyClass() 
{ 

} 
+3

'wiederholen Sie dies;' sollte nicht kompilieren. Machen Sie eine [mcve], wenn dies der Fall ist. – nwp

+0

Es kompiliert. Deshalb frage ich. –

+0

Wenn Sie Ihre Vorlage instanziieren und Operator = verwenden, erhalten Sie einen Fehler. siehe meine Antwort – AnatolyS

Antwort

4

Für Vorlage Compiler überprüft nur Syntax. Wenn Sie Ihre Vorlage instanziiert und versuchen, Objekte zu kopieren, erhalten Sie Fehler kompilieren für die Rückkehr dieser:

MyQueue<int> a; 
MyQueue<int> b; 
a = b; /// ops 

Oder Sie können Ihre Vorlage explizit instantiate (in diesem Fall Compiler generiert alle Mitglied und sehen Sie alle Fehler)

template class MyQueue<int>; 

So return * Dies ist nur eine Möglichkeit, Referenz für Objekt von Member-Funktion oder Operator zurückgeben.

+0

explizite Instanziierung ist der Trick, den ich brauchte! –

0

this vom Typ MyQueue<T>* const während *this ist MyQueue<T>, so return this nicht funktionieren sollte, es sei denn es eine implizite Umwandlung von MyQueue<T>* zu MyQueue<T> ist.

Verwandte Themen