2011-01-10 24 views
12

同じタイプの揮発性オブジェクトにオブジェクトを割り当てたいのですが、コンパイラエラーが発生しました。それを作るためにプログラムを変更するには?それを働かせる以外に、なぜ私はそれを直接行うことができないのですか?揮発性オブジェクトにオブジェクトを割り当てることができません

ここでは、Visual Studio 2010をコンパイラとして使用しました。

class A 
{ 
public: 
}; 

int _tmain() 
{ 
    A a; 
    volatile A va; 
    va = a;  // compiler error:C2678 here 
    return 0; 
} 
+2

'const'と' volatile'は同じコインの両面です。それらは非常に関連しているので、Standardはしばしばそれらを 'cv-qualifiers'と呼んでいます。これを見て:http://stackoverflow.com/questions/4479597/does-making-a-struct-volatile-make-all-its-members-volatile/4479652 – Nawaz

答えて

18

あなたはvolatile修飾子でAのための代入演算子の関数を定義する必要があります。

class A 
{ 
    public: 

    volatile A& operator = (const A& a) volatile 
    { 
     // assignment implementation 
    } 
}; 

あなたはクラスの代入演算子を定義しない場合、C++はA& operator = (const A&);のデフォルトの代入演算子を作成します。しかし、volatile修飾子を持つデフォルトの代入演算子は作成されないので、明示的に定義する必要があります。

+1

ありがとう。戻り値の型は 'volatile A 'でなければなりません。 – Thomson

+0

@Thomson:はい。あなたが正しい。 – Nawaz

+0

'struct'型を制御しないと、プラットフォームのヘッダファイルからこの問題をきれいに解決できますか? – Kaz

-1

私は同じ質問に遭遇しました。例えば:

struct A { int i; } 
volatile A a; 
A b; 
a = b; // C2678 here. 

私はそれを解決するには、この方法を発見した:

const_cast<A &>(a) = b; 
+0

volatileをキャストすることはできません。コードには未定義の動作があります。 –

+0

@JamesJohnston構造体の定義を制御しない場合、より洗練されたソリューションがありますか? (システムAPIヘッダーの場合と同じですか?)私はこのソリューションを使いました。これは 'const'修飾子ではないので、動作が定義されていないとは思わない。オブジェクトへの代入は、それが「volatile」であるか否かにかかわらず許可され、「volatile」は特殊な種類のアクセスではない。修飾子は最適化(2つ以上のアクセスが1つにマージされるかどうか)にのみ影響します。私の特別な状況ではそれは問題ではありません。おそらく問題になることはありません。 – Kaz

+0

申し訳ありませんが、私はあなたが間違っていると思いますし、行動は未定義です。 http://stackoverflow.com/a/7368038/562766 - C11から: "非volatile型の左辺値を使用してvolatile修飾型で定義されたオブジェクトを参照しようとしました(6.7 .3) "---上記の例では、volatileは最初はvolatileで定義された" a "からキャストされ、割り当てられます。あなたのコードの正しさは、今やオプティマイザの慈悲である。 –

関連する問題