13

C++11 構文を使用して STL マップを初期化しようとしていますが、うまくいかないようです。初期化後、要素にアクセスしようとすると、Foo のプライベート コンストラクターを呼び出そうとします。私は何か見落としてますか?at を使えばうまくいきます。operator[] を使用して初期化された値にアクセスできるかどうか疑問に思っています...

#include <map>
#include <string>

class Foo{
public:
    int a, b;
    Foo(int a_, int b_){
        a = a_;
        b = b_;
    }

private:
    Foo(){};
};


int main(){

    std::map<std::string, Foo> myMap = { {"1", Foo(10,5)}, {"2", Foo(5,10)} };
    int b  = myMap["1"].b;    // it tries to call private constructor of Foo.
    return 0;
}
4

2 に答える 2

22

マップ上で を使用operator[]する場合、演算子を使用して、マップから値を取得するか、マップに値を割り当てることができます。値をマップに割り当てるために、マップはその値の型のオブジェクトを構築し、それを参照によって返す必要があります。これによりoperator=、既存のオブジェクトを上書きするために使用できます。

したがって、代入先の新しいオブジェクトを作成できるように、型はデフォルトで構築可能である必要があります。

実行時に、キーが既に存在する場合、コンストラクターは呼び出されませんが、コンパイラーは、存在しない値にアクセスするために使用するかどうかを知る方法がoperator[]ないため、コンストラクターをパブリックにする必要があります。

于 2012-06-07T22:58:52.457 に答える
19

operator[]of map は、型がデフォルトで構築可能である必要があります。これは、エントリが存在しない場合に新しいエントリを作成するためです。

at()代わりに、エントリが存在しない場合にスローするものを使用できます。

int b  = myMap.at("1").b;
于 2012-06-07T22:56:57.057 に答える