编译以下内容时:
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}}?
答案 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
避免隐式转换(除非这是您想要的)。