首页 > 解决方案 > 对象上不可行的按位或赋值运算符

问题描述

以下代码段(实际程序的简化)产生以下内容: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);
}

我想避免这些可行的替代方案是否有任何直接的方法来解决它(如果可能,使用额外的操作员)?

注意:代码的 wrap-like 方面不能更改,即不要摆脱直接CMyInt使用intat CBitFlags

编辑:从第一条评论来看,似乎没有其他方法可以解决它。但是,我也想知道,为什么更长的 OR 分配版本可以代替?

谢谢。

标签: c++

解决方案


在模板类CBitFlags 上声明方法

void SetFlag(int flag) { mValue |= flag; }

该方法需要为泛型类 T 定义的运算符 |=。

声明时,在main方法中

CBitFlags<CMyInt> flags;

编译器尝试为未定义的CMyInt类查找|=运算符(您重载了=运算符而不是|=运算符)。您应该做的是更改CMyInt上的运算符定义,如下所示:

void operator|=(int &value) { mValue = value; }

避免“错误:没有可行的重载'|='”


推荐阅读