C++模板类的一个赋值问题

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

原文地址:https://www.cnblogs.com/mindulmindul/p/12149235.html