错误C2678:二进制'+':找不到运算符,它接受类型为'volatile A'的左手操作数(或者没有可接受的转换)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误C2678:二进制'+':找不到运算符,它接受类型为'volatile A'的左手操作数(或者没有可接受的转换)相关的知识,希望对你有一定的参考价值。

我以前用C ++编程,但已经好几年了。我是C ++ 11的新手,我遇到以下问题。

我的类比仅仅存储“构造函数中给出的值的两倍”更复杂,但为了简单起见,这个例子只是将构造函数输入乘以2.该类必须隐式转换为和来自int,因此operator int()operator=(const int)和构造函数,采取int

除非我的类的实例被定义为volatile,否则一切正常。当我随后尝试使用volatile实例进行操作时,Visual Studio会抱怨:

#include <iostream

class A
{
private:
   int _i;
public:
   A() = default;
   constexpr A(const int i) : _i(i*2) {}
   constexpr operator int() const { return _i/2; }
   A& operator=(const int i) { _i = i*2; return *this; }
};

//A va; // <---- this works (though I need it to be 'volatile')
volatile A va; // <--- this gives error C2678: binary '+': no operator found which takes a left-hand operand of type 'volatile A' (or there is no acceptable conversion)

int main()
{
   int j;
   j = va + 12; // <--- Here's where the error occurs
   std::cout << "j = " << j << std::endl;
}

看到错误表明存在“无法接受的转换”,我尝试向类中添加一个复制构造函数,该构造函数接受volatile,但这并没有解决问题:

   constexpr A(volatile const A& other) : _i(other._i) {}

我可以通过扔掉volatile来“修复”它...

   j = (A)va + 12;

...但是这个解决方案对我不起作用,因为我的类实际上是模拟器环境的一部分,它试图模拟嵌入式硬件并在模拟环境中运行嵌入式代码。我的类必须充当硬件寄存器的替身,我不能(或者不想)在volatile语句中抛弃j = va + 12;,因为该行是嵌入式固件本身的一部分。是否有一些转换运算符或方法我可以添加到我的class A使声明j = va + 12;无需修改即可工作?

答案

你在错误的地方添加volatile

为了在j = va + 12中执行加法,va需要转换为int,因为operator+中没有定义A。现有的转换运算符标记为const,编译器不会使用它来转换volatile对象。

解决方案是在您的类中添加一个额外的operator int,以支持易失性对象的转换:

constexpr operator int() volatile { return _i/2; }

你需要现有的const和这一个。

以上是关于错误C2678:二进制'+':找不到运算符,它接受类型为'volatile A'的左手操作数(或者没有可接受的转换)的主要内容,如果未能解决你的问题,请参考以下文章

C2678 二进制“<”: 没有找到接受“const ***”类型的左操作数的运算符解决办法

nodejs连接mysql报错Error: ER_BAD_DB_ERROR: Unknown database 'book',菜鸟找不出原因?

我正在尝试对运算符'+'执行二进制重载,但输出错误,我不明白为什么?

关于VC6.0的找不到头文件的问题

'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

delphi2010 VCLskin5.6 编译时找不到文件