对于以下类模板,如果想要实现类赋值,使用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 相同。