3

オブジェクトへの参照を含むstd::vectorへの参照を取得できないのはなぜですか?次のコードは、Visual C++2010でコンパイルエラーを生成します。

void Map::Filter( Object::Type type, std::vector<Object&>& list )
{
  for ( register int y = 0; y < MAP_H; y++ )
    for ( register int x = 0; x < MAP_W; x++ ) {
      if ( under[y][x].GetType() == type )
        list.push_back(under[y][x]);
      if ( above[y][x].GetType() == type )
        list.push_back(above[y][x]);
    }
}

要約されたコンパイルエラー:

c:\program files\microsoft visual studio 10.0\vc\include\xmemory(137): error C2528: 'pointer' : pointer to reference is illegal
c:\program files\microsoft visual studio 10.0\vc\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled

「オブジェクトへの参照のベクトル」から「オブジェクトへのポインタのベクトル」に切り替えることで、問題を解決しました。参照のベクトルへの参照を持てない理由が理解できません。

4

1 に答える 1

4

標準のコンテナは、アロケータを使用してメモリを割り当て、要素を構築および破棄します。アロケータ要件はX、タイプのオブジェクトの割り当てを担当するアロケータクラスに指定されていますT。タイプTは、「非定数、非参照オブジェクトタイプ」として指定されます(表27)。したがって、参照オブジェクトのアロケータは必要ありません。これは、参照型のコンテナを作成しようとすると、未定義の動作に直接つながることを意味します。

表27は、§17.6.3.5アロケータの要件にあります。

ここに画像の説明を入力してください

別の方法は、のベクトルstd::reference_wrapperpush_back要素を次のように使用することです。

list.push_back(std::ref(under[y][x]));

もう1つの方法は、生のポインターを使用するか、世界で最も愚かなスマートポインターの実装を使用することです。

また、ベクターを呼び出さないことをお勧めします。コンテナータイプlistがあります。std::listそれは何のリストですか?catspeoplebananas

于 2013-03-02T19:56:47.427 に答える