c++ - 对象上不可行的按位或赋值运算符
问题描述
以下代码段(实际程序的简化)产生以下内容:error: no viable overloaded '|='
class CMyInt
{
int mValue;
public:
operator int() { return mValue; }
void operator=(int &value) { mValue = value; }
};
template<class T>
class CBitFlags
{
T mValue;
public:
void SetFlag(int flag) { mValue |= flag; }
};
int main()
{
CBitFlags<CMyInt> flags;
flags.SetFlag(1);
}
我想避免这些可行的替代方案是否有任何直接的方法来解决它(如果可能,使用额外的操作员)?
- 更改
CMyInt::operator int()
为按引用返回,之后|=
at的赋值部分CBitFlags
不会调用我的 customCMyInt::operator=
,我需要在实际程序对应项中调用它而不是“原始”赋值 - 将按位或赋值更改
CBitFlags::SetFlag()
为mValue = mValue | flag
(我现在正在使用) - 实施
operator|=
atCMyInt
注意:代码的 wrap-like 方面不能更改,即不要摆脱直接CMyInt
使用int
at CBitFlags
。
编辑:从第一条评论来看,似乎没有其他方法可以解决它。但是,我也想知道,为什么更长的 OR 分配版本可以代替?
谢谢。
解决方案
在模板类CBitFlags 上声明方法
void SetFlag(int flag) { mValue |= flag; }
该方法需要为泛型类 T 定义的运算符 |=。
声明时,在main方法中
CBitFlags<CMyInt> flags;
编译器尝试为未定义的CMyInt类查找|=运算符(您重载了=运算符而不是|=运算符)。您应该做的是更改CMyInt上的运算符定义,如下所示:
void operator|=(int &value) { mValue = value; }
避免“错误:没有可行的重载'|='”
推荐阅读
- javascript - 将 Electron 与 Parcel 和 Babel 7 一起使用时出现“意外标识符”
- javascript - 有没有办法在同一个反应元素内的钩子调用之间进行交互
- unity3d - Unity Editor:检查是否因为场景正在关闭而调用 OnDestroy() 方法
- memory-management - 垃圾收集是否需要更大的内存占用?
- r - 在R中的`$`登录后使用替代品
- c - 可以在 C 语言的回调中使用外部函数指针吗?
- sql - 对子查询/表返回的每一行执行选择并组合(联合)结果
- javafx - 使用时间线或动画类的过渡更好吗?
- c# - 已设置通用操作后如何更新它?
- sql - SQLAnywhere - 如何格式化日期