8

以下は、マップの値として使用されるクラスです。

class Book
{
    int m_nId;
public:
    // Book() { }  <----- Why is this required?
    Book( int id ): m_nId( id ) { }

};

main()内:

map< int, Book > mapBooks;

for( int i = 0; i < 10; ++i )
{
    Book b( i );
    mapBooks[ i ] = b;
}

エラーの原因となるステートメントは次のとおりです。

mapBooks[ i ] = b;

デフォルトのコンストラクターを追加しても、エラーは表示されません。しかし、なぜ必要なのかわかりません。誰か説明できますか?を使用insert()しても問題は発生しません。

ちなみに、私はVisual C++2008を使用してコンパイルしています。

4

1 に答える 1

12

operator[]2段階のプロセスを実行します。最初に、指定されたキーのマップエントリを検索または作成し、次にエントリの値部分への参照を返します。これにより、呼び出し元のコードがそのキーに対して読み取りまたは書き込みを行うことができます。

以前にエントリが存在しなかった場合、エントリの値の半分は、割り当てられる前にデフォルトで作成される必要があります。これは、エントリがすでに存在する場合と一貫性を保つためにインターフェイスが機能するために必要な方法です。

マップでそのようなタイプを使用する必要がある場合は、「手動で」を使用しての使用を避ける必要がありますoperator[]findinsert

于 2010-02-27T09:29:34.987 に答える