具有不同模板参数的模板类的默认赋值运算符
Default assignment operator for template class with different template parameters
编译以下内容时:
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
避免隐式转换(除非这是您想要的)。
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 模板赋值运算符不替换默认赋值运算符
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 具有不同模板参数的模板类的默认赋值运算符
- 重载赋值运算符或使用默认运算符
- 为什么我不能在 C++ 中使用模板版本覆盖默认的复制构造函数和赋值运算符
- c++默认的复制和赋值运算符
- 当类成员是引用时,是否无法生成默认赋值运算符?(在C++中)
- "非静态引用成员,不能使用默认赋值运算符"