无法更改volatile变量的值

时间:2012-07-26 16:38:38

标签: c++ volatile

说明

我无法设置变量或在定义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] 

2 个答案:

答案 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;