2012-04-02 78 views
2

当编译如下:默认赋值运算符参数

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=noperator=n不应该转换为int,而这又将被分配到c

回答

4

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

2

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

实际上,您在这里没有assigment运算符,只有构造函数和类型运算符。这意味着你的编译器很可能已经把可能的线沿线的一个默认:

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

+0

'模板类被构造为一个char' - 我有很大的问题试图找出你的意思。一个被构造的类作为a_'char'? – sehe 2012-04-02 11:40:48

+0

'n'被构造为一个'int'。它有一个'int'运算符。 'c'可以被分配'int's。顺便说一句,它不会以另一种方式工作,所以问题不在于将'int'赋值给'char'。 – baruch 2012-04-02 11:42:49

+0

你能澄清一下吗?我不明白问题是什么。 – baruch 2012-04-02 11:45:23