gpt4 book ai didi

c++ - 错误 C2678 : binary '+' : no operator found which takes a left-hand operand of type 'volatile A' (or there is no acceptable conversion)

转载 作者:行者123 更新时间:2023-11-28 01:36:25 24 4
gpt4 key购买 nike

我以前用 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;

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

最佳答案

您在错误的位置添加了 volatile

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

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

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

您将需要现有的 const 和这个。

关于c++ - 错误 C2678 : binary '+' : no operator found which takes a left-hand operand of type 'volatile A' (or there is no acceptable conversion),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49090641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com