错误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',菜鸟找不出原因?
我正在尝试对运算符'+'执行二进制重载,但输出错误,我不明白为什么?