2016-06-12 100 views
3

返回*thisthis与通过引用返回对象的模板函数有什么区别? 这两个选项在VS2013中没有任何问题编译;返回参考模板

的代码是一样的东西

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

'retun this;'不应该编译。如果有,请制作[mcve]。 – nwp

+0

它编译。这就是为什么我问。 –

+0

当你实例化你的模板并使用operator =时,你会得到错误。看到我的回答 – AnatolyS

回答

4

仅用于模板编译器检查语法。当你实例化模板,并尝试复制的对象,你会得到编译错误的回报是:

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

或者你可以明确的实例化你的模板(在这种情况下,编译器生成的所有成员,你看到的所有错误)

template class MyQueue<int>; 

因此,返回*这是从成员函数或操作符返回对象的唯一方法。

+0

显式实例化是我需要的技巧! –

0

thisMyQueue<T>* const类型,而*thisMyQueue<T>,所以return this不应该工作,除非有一个隐式转换从MyQueue<T>*MyQueue<T>