1

説明:

変数が揮発性(メイン)で定義されている間は、変数を設定したり変更したりできません。volatileを削除すると問題は解決しますが、変数をvolatileにする必要があります。

私の試み:

本当にたくさんの試みがあります。operator =をオーバーロードし、新しいoperator =を揮発性にし、新しい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は、代入式の評価の結果である揮発性オブジェクトへのアクセスが発生していないという警告を発行しません。標準では、無効なコンテキストでは左辺値から右辺値は存在しないとされています。変換、したがってアクセスなし。変換を明示的にします。

于 2012-07-26T16:45:27.793 に答える
1

ええ、それは正しいです、あなたにはvolatile PlaceParentConversion& operator =(const PlaceParentConversion&) volatile;

于 2012-07-26T16:45:36.433 に答える