2012-03-24 8 views
2

operator =()を使用せずにC++のstd :: vectorにpush_back()を行うにはどのようにconstメンバーを持つデフォルト定義に違反していますか?constメンバーのoperator =()を使用しないpush_backの方法は?

struct Item { 
    Item(int value) 
    : _value(value) { 
    } 
    const char _value; 
} 

vector<Item> items; 

items.push_back(Item(3)); 

オブジェクトが作成された後、それは変更すべきではありませんので、ご質問は、私は演算子=を(起動せずに要素を持つ私のベクトルを初期化しない方法ですので、私は)、_valueのCONSTを維持したいのですが? std::vector<T>については

.../3.4.6/bits/vector.tcc: In member function `Item& Item::operator=(const Item&)': 
.../3.4.6/bits/vector.tcc:238: instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]' 
.../3.4.6/bits/stl_vector.h:564: instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]' 
item.cpp:170: instantiated from here 
.../3.4.6/bits/vector.tcc:238: error: non-static const member `const char Item::_value', can't use default assignment operator 
+1

私はうまくいくはずだと思います。私はなぜあなたが 'operator ='について話しているのだろうと思っています。それはどこにも呼ばれません。 – Nawaz

+1

'push_back'は' operator =() 'を呼び出す必要はなく、コピーコンストラクタを使ってコンテナに追加されるオブジェクトのコピーを作成するだけです。何が問題なのですか? –

+0

@Als追加したエラーメッセージを参照してください。 – WilliamKF

答えて

11

を要素が割り当て可能であることが要求されています。ここでは

がg ++ v3.4.6が私に与えている基本的なエラーです。入力は割り当て可能ではありません。の実装。 std::vector<T>は、この要件を主張するのを避けることができますが、結果コードが移植性がないため、これは不都合です。

代わりにstd::list<T>を使用するか、あなたのタイプの定義を変更することができます。たとえば、値を読み取るだけでセッターは読み取らないようにアクセサを作成できます。もちろん、割り当てによって値が変更されます。したがって、この変更を許可するか、またはオブジェクトをコンテナに入れることができます。あなたは両方を取得しません。

+0

+1ああ素敵なanswer.EveryoneコメントまたはこのQのポイントを逃した(私を含む)に答えるすべてのコンテナの基本要件はおそらく、OPは 'push_back()'を特定のケースとして言及したという事実によって、誰もが誤解されていました。 –

+0

@Alsランダムアクセスが欲しいので、リストの代わりにベクターを使用しています。アイテムをベクターに配置すると、それらを変更する必要はありません。必要に応じてベクターを初期化する方法はありますか?この1つの問題以外に、私のプログラムはコンパイルされるので、他のすべての用途はコンパイラにとって受け入れられます。 – WilliamKF

+0

@DietmarKühl私のメンバをnon-constにすることはできますが、ベクターに挿入した後に_valueが変更された場合、私のプログラムで何かが間違っているので、それが劣ると感じます。どのコンテナが私にランダムなアクセスを与えますが、constメンバーをあきらめる必要はありませんか? – WilliamKF

関連する問題