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