web-dev-qa-db-ja.com

イニシャライザリストでunordered_mapを初期化します

私は非常に些細な問題であるかもしれないものへの解決策を見つけようとしています。クラス初期化子リストのconst unordered_mapを初期化したいのですが。ただし、コンパイラ(GCC 6.2.0)が受け入れる構文はまだ見つかりません。コードリンクは ここ です。

#include <unordered_map>

class test {
 public:
    test()
      : map_({23, 1345}, {43, -8745}) {}

 private:
   const std::unordered_map<long, long> map_;
 };

エラー:

main.cpp: In constructor 'test::test()':
main.cpp:6:36: error: no matching function for call to 'std::unordered_map<long int, long int>::unordered_map(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
  : map_({23, 1345}, {43, -8745}) {}
                                ^

複素定数を初期化リストで初期化することはできませんか?または、構文を変える必要がありますか?

7
ilya1725

括弧の代わりに中括弧を使用します

class test {
 public:
    test()
      : map_{{23, 1345}, {43, -8745}} {}

 private:
   const std::unordered_map<long, long> map_;
 };
10

括弧の代わりに中括弧を使用します。括弧を使用すると、initializer_list型のパラメーターを持つオーバーロードされたコンストラクターではなく、引数に最も一致するコンストラクターが呼び出されるためです。

括弧と中括弧を使用すると、initializer_list型をパラメーターとして受け取るオーバーロードされたコンストラクターが存在するまで、同じ効果があります。次に、中括弧を使用すると、コンパイラは逆方向に曲がって、オーバーロードされたコンストラクタを呼び出そうとします。

例えば:

Foo( 3 ) is calling Foo( int x ) constructor;
Foo{ 3 } is calling Foo( initializer_list<int> x ) constructor;

but if there's no Foo( initializer_list<int> x ) constructor

then Foo( 3 ) and Foo{ 3 } are both calling Foo( int x ) constructor.
2
Guan Wang