2012-02-29 7 views
11

2D std :: array troughイニシャライザを初期化しようとしていますが、コンパイラはイニシャライザが多すぎると言っています。C++ 11で多次元std :: arrayを(イニシャライザのリストを通して)どのように初期化しますか?

例えば:

std::array<std::array<int, 2>, 2> shape = { {1, 1}, 
              {1, 1} }; 

コンパイラエラー:エラー:あまりにも多くの初期化子‘std::array<std::array<int, 2ul>, 2ul>’

のためではなく、明らかにあまりにも多くはありません。私は何か間違っているのですか?

答えて

13

は、我々は内部のCの配列を初期化していることを確認するために、1つ以上のペア{}を追加しようと、私は(もそれをしようとしていなくて、私は間違っている可能性)を示唆しています。

std::array<std::array<int, 2>, 2> shape = {{ {1, 1}, 
              {1, 1} }}; 

またはすべての角かっこを削除してください。

std::array<std::array<int, 2>, 2> shape = { 1, 1, 
              1, 1 }; 
+0

私はそれをやらなければならないということは、いつも私には抽象的なリークのように感じます。ライブラリの結果が、言語の "内部"ではなく、それと一緒に構築されたということだけです。 –

+1

警告を出さない場合は、 'std :: array ,2> shape = {{{{1,1}}、{{1,1}}}}'のようにしてください。 eww – Jeff

6

typedef std::array<int, 2> row; 
std::array<row,2> shape = { row {1,1}, row {1,1} }; 
+1

しかし、なぜ私のバージョンではないのだろうかと思っています。両方の表現は最初の見方では同等であるように見えます。 –

+0

@zoopp:そうではありません。 Basileは明示的な構造を使用しますが、そうではありません。 –

+0

わかりました。 –

関連する問題