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

时间:2012-04-02 11:34:58

标签: c++ templates

编译以下内容时:

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;
}

编译器陷入第三项任务,表示operator=中的c=n不匹配。 n不应转换为int,而c又会转为{{1}}?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

这里实际上没有分配运算符,只有构造函数和类型运算符。这意味着您的编译器可能会放置一个默认值:

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避免隐式转换(除非这是您想要的)。