2013-01-01 98 views
1

我有以下代碼:同類型模板類的內部函數模板

#include <iostream> 
using namespace std; 

template<typename T> class myclass { 
public: 
    T data; 

    myclass(T const & _data = T()) : data(_data) {} 

    template<typename U> myclass<T> & operator=(myclass<U> const & rhs) { 
     cout << data << " = " << rhs.data << endl; 
     return *this; 
    } 
}; 

int main() { 
    myclass<double> first(1); 
    myclass<float> second(2); 
    myclass<double> third(3); 
    first=second; 
    first=third; 
} 

現在,althought它編譯完美,輸出只是:

1 + 2 

爲什麼不先=第三打電話給

myclass<double> & operator=(myclass<double> const & rhs) 

回答

1

複製賦值運算符永遠不是函數模板。由於該類未聲明覆制賦值運算符,因此編譯器會生成一個並使用此生成的運算符。如果你添加一個這樣的操作符,你會看到作業:

myclass<T>& operator= (myclass<T> const& rhs) { 
    std::cout << "(copy) " << data << " = " << rhs.data << '\n'; 
    return *this; 
} 
+0

謝謝,我現在明白了 – lexsintra

+0

我實際上已經嘗試過類似的功能,但正在尋找一種「更清潔」的解決方案。 – lexsintra

0

複製賦值操作符永遠不是模板。由於你沒有定義一個,因此爲你定義了一個默認版本(它不打印任何東西)。