2016-01-10 15 views
15

これはおそらく非常に単純な答えですが、実際には分かりません。なぜこれを行うにはエラーが発生するのですか?このようなものを初期化する正しい方法は何ですか? MSVC 2015年タイルのタイルの配列を中括弧で初期化します

std::array<std::tuple<int, std::string>, 3> tuples{ 
    {3, "a"}, 
    {7, "b"}, 
    {2, "c"} 
}; 

、私は、次のエラーを取得:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>" 
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>" 

答えて

24

これはtupleと優れ問題です。 its constructor in C++11/14 is explicitを参照してください。したがって、内側のbraced-init-listsが行うコピーリストの初期化には参加できません(外側のリストは直接リストの初期化です)。

アイデアはprevent you from being able to bypass a class's explicit constructors through tupleでした。しかし、C++ 17では、これが変更されます:タプルの型すべてが、それぞれの型から暗黙的に変換可能な場合は、そのコンストラクタもtupleになります。

特定の使用例については、std :: pairを使用できます。そのコンストラクタは決してexplicitです。

+1

だから、他の男の削除された答えは、実際に私が投稿する前に働いた理由です。私はそれが私が期待していなかった何か他のことをしていたかもしれないと思った。私はC配列を使用するか、そうするしかないでしょう。 Ugh ... C++ 17は十分に速くなりません。 – Alex

+1

@AlexYan:あなたの現在の型は2つのメンバしか持たないので、 'pair'を使うことができます。 –

+1

'std :: make_tuple'も動作します。 (理由はわかりません) – edmz

関連する問題