2017-10-03 11 views
0

配列の要素の1つを別のオブジェクトに設定しようとしています。しかし、コンパイラは=演算子を削除しています。なぜここでそれをやっているのですか?そして、私はどうすればそれを回避できますか?=演算子は削除されていますが、どうすれば回避できますか?

例コード:

struct IntContainer 
{ 

    IntContainer(const int value) : 
    value(value) 
    { 
    } 

    IntContainer() : 
    IntContainer(0) 
    { 
    } 

    const int value; 
}; 

int main(int argc, char** argv) 
{ 

    IntContainer intContainers[3]; 
    IntContainer newIntContainer(420); 
    intContainers[0] = newIntContainer; // <-- Causes compiler error 

    return 0; 
} 

このスニペットをコンパイルするとき、私は取得していますコンパイラエラーがある:

main.cpp: In function 'int main(int, char**)': 
main.cpp:23:24: error: use of deleted function 'IntContainer& IntContainer::operator=(const IntContainer&)' 
    intContainers[0] = newIntContainer; // <-- Causes compiler error: 
         ^~~~~~~~~~~~~~~ 
main.cpp:2:8: note: 'IntContainer& IntContainer::operator=(const IntContainer&)' is implicitly deleted because the default definition would be ill-formed: 
struct IntContainer 
     ^~~~~~~~~~~~ 
main.cpp:2:8: error: non-static const member 'const int IntContainer::value', can't use default assignment operator 
+4

あなたは何かを 'const'変数に代入しますか? – NathanOliver

+0

@ NathanOliverキャストする:D – UKMonkey

+0

コンストラクタの値に代入していませんか? – gromit190

答えて

7

コンパイラは、一般的にあなたにoperator=を与え、自由のためのコピーコンストラクタが、クラスにconstメンバが含まれている場合、constメンバへの割り当てを実行できないため、operator=を生成するのは意味がありません。

自分で書くこともできますが、依然としてconstメンバーに値を割り当てることはできません。

+0

私の唯一のオプションは、constメンバーを削除することです? (代わりにクラスを使用して、メンバーを非公開にしてください) – gromit190

+1

@ gromit190 'const'メンバーを削除すると、この問題は解決します。しかし、問題に対する実際の解決策は、そのクラスの目的によって異なります。おそらく、正しい決定はメンバを 'const'に保つことであり、単に決して割り当てを行うことではないことが判明しました!あなたの目的がメンバーへの直接アクセスを停止するだけの場合は、クラスを使用してメンバーを非公開にすることが正しいと思います。繰り返しますが、問題の解決方法は、達成しようとしていたものによって決まります。 –

+2

オブジェクトの不変量を保存するために 'const'セマンティクスが必要な場合、カプセル化は間違いなく有効な解決策です – KABoissonneault

関連する問題