说明
我无法设置变量或在定义volatile时更改它(在Main中)。删除volatile可以解决问题,但我需要将变量设置为volatile。
我的尝试:
真的有很多尝试。重载operator =,使new operator = volatile,制作新的volatile方法。到目前为止,没有任何实际工作。
我的主要人物:
int main() {
volatile PlaceParentConversion s(10.0); // remove volatile = no errors
std::cout << s.mX << std::endl;
s = PlaceParentConversion::IDENTITY_CONVERSION;
std::cout << s.mX << std::endl;
return 0;
}
我的课程:
class PlaceParentConversion {
public: //all public, easier to check
const static PlaceParentConversion IDENTITY_CONVERSION;
double mX;
PlaceParentConversion(const double x);
PlaceParentConversion(const PlaceParentConversion& other);
};
const PlaceParentConversion PlaceParentConversion::IDENTITY_CONVERSION(0);
PlaceParentConversion::PlaceParentConversion(const double x) : mX(x) {}
PlaceParentConversion::PlaceParentConversion(const PlaceParentConversion& other) : mX(other.mX) {}
错误:
‘volatile PlaceParentConversion’ as ‘this’ argument of ‘PlaceParentConversion& PlaceParentConversion::operator=(const PlaceParentConversion&)’ discards qualifiers [-fpermissive]
答案 0 :(得分:2)
定义volatile
赋值运算符:
Foo volatile & operator=(Foo const & rhs) volatile
{
// ...
return *this;
}
(为了便于阅读,我缩短了你的班级名称。)
这是一个更完整的例子:
struct Foo
{
Foo() { }
Foo(Foo const volatile &) { }
Foo volatile & operator=(Foo const &) volatile
{ return *this; }
};
int main()
{
volatile Foo x;
Foo y;
static_cast<Foo>(x = y);
}
最后一行中的静态强制转换使得GCC不会发出警告,表明不会对volatile对象进行访问,这是对赋值表达式求值的结果:标准说在void上下文中没有左值 - 转换为右值,因此无法访问。我们明确转换。
答案 1 :(得分:1)
是的,这是正确的,因为你没有volatile PlaceParentConversion& operator =(const PlaceParentConversion&) volatile;