具有不同模板参数的模板类的默认赋值运算符

Default assignment operator for template class with different template parameters

本文关键字:默认 赋值运算符 参数      更新时间:2023-10-16

编译以下内容时:

template <class T>
class Number
{
    private:
        T num;
    public:
        Number() {}
        Number( T n ) : num(n) {}
        operator T() const { return num; }
};
int main()
{
    Number<int> n=5;
    Number<char> c=4;
    int i;
    c=int(5);
    i=n;
    c=n;
    return 0;
}

编译器在第三次赋值时被卡住,说c=n中没有operator=的匹配项。难道n不应该转换为int,然后再分配给c吗?

根据标准,最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。在这里,您期望编译器为Number<char>应用构造函数,为Number<int>应用转换运算符。请参阅:https://stackoverflow.com/a/867804/677131.

这是因为当模板化类是用char的模板化类型构造的时,没有int运算符。

实际上,这里没有赋值运算符,只有构造函数和类型运算符。这意味着你的编译器可能已经放入了一个默认的,可能是按照以下行:

Number<T>& operator=( Number<T>& rhs );

您应该实现自己的赋值运算符,这应该可以解决您的问题。通用解决方案可以如下所示,但依赖于类型之间的有效赋值。

template <typename T, typename V>
class Number
{
    private:
        T num;
    public:
        Number() {}
        Number( T n ) : num(n) {}
        operator T() const { return num; }
        operator=( V& rhs ){ num = rhs; // etc }
};

您还需要使类构造函数explicit避免隐式转换(除非这是您想要的)。