1. ホーム
  2. c++

[解決済み] C++のmap型引数で[]を使用する場合、空のコンストラクタが必要なのはなぜですか?

2022-09-15 22:57:15

質問

以下もご参照ください。 C++標準のリストとデフォルトで構築可能な型

大きな問題ではありませんが、私のクラスが特定の引数なしでインスタンス化されることを望まないので、ただ迷惑なだけです。

#include <map>

struct MyClass
{
    MyClass(int t);
};

int main() {
    std::map<int, MyClass> myMap;
    myMap[14] = MyClass(42);
}

これは、以下のようなg++のエラーが発生します。

/usr/include/c++/4.3/bits/stl_map.h:419: error: no matching function for call to 'MyClass()'.

これは、デフォルトのコンストラクタを追加すると、うまくコンパイルされます。

どのように解決するのですか?

この問題は、operator[]に起因しています。SGIドキュメントより引用。

data_type& operator[](const key_type& k) - オブジェクトへの参照を返します。 特定の への参照を返します。マップがまだそのようなオブジェクトを含んでいない場合 がそのようなオブジェクトを含んでいなければ operator[] はデフォルトのオブジェクトを挿入します。 data_type() .

デフォルトのコンストラクタがない場合は、insert/find関数を使用することができます。 以下の例ではうまく動作しています。

myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;