對於以下類模板,如果想要實現類賦值,使用assign()函數。如下
template<class T> class MyClass{ private: T value; public: void setValue(T& _value){ value = _value; } void assign(const MyClass<T> &x){ value = x.value; } T getValue(){ return value; } }; int main(void) { MyClass<double> d; MyClass<double> dd; double temp=23.123; d.setValue(temp); dd.assign(d); cout << d.getValue() << endl << dd.getValue() << endl; return 0; }
如果,兩個類的 T 不一樣,再使用assign()方法進行賦值
int main(void) { MyClass<double> d; MyClass<int> i; double temp=23.123; d.setValue(temp); i.assign(d); cout << d.getValue() << endl << i.getValue() << endl; return 0; }
問題如下
可以看到,assign()函數渴望要一個const MyClass<int>類型的對象作為參數,但是卻得到了一個MyClass<double>的對象。同時MyClass<double>無法轉換為const MyClass<int>,於是編譯器就會報錯。
我們需要重新定義一下MyClass的assign函數,使得上述賦值行的通。
template<class X> //添加X void assign(const MyClass<X> &x){ //把要用來賦值的x定義成另一種類型X value = x.getValue(); }
這樣,上述賦值就可以工作了。
只要從X到T的賦值可以執行,那這個assign函數就可以執行。這樣其實是避免了必須要讓assign函數參數中的 T 必須和assign所屬對象的 T 相同。