1

描述:

当变量定义为 volatile 时(在 Main 中),我无法设置或更改它。删除 volatile 解决了这个问题,但我需要我的变量是 volatile。

我的尝试:

真的有很多尝试。重载 operator=,使 new operator= volatile,使 new 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] 
4

2 回答 2

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 上下文中没有左值到右值转换,因此无法访问。我们使转换显式。

于 2012-07-26T16:45:27.793 回答
1

是的,这是正确的,因为你没有volatile PlaceParentConversion& operator =(const PlaceParentConversion&) volatile;

于 2012-07-26T16:45:36.433 回答