CとC++の狭間…C++使いになりきれないつぶやき その2std::arrayと配列は全く同じではない話

前回と同様, 迷いながらC++を使っている今日この頃.

写真は実家から送られて来た柿, 甘くて美味いのです.

引き続きC++使いになりきれないつぶやきシリーズです(笑)

構造体の配列

以下のような構造体,

struct hoge
{
  int a;
  int b;
  unsigned long c;
};

それを配列として宣言する場合は以下の様に書きます.

const struct hoge hoge_array0[] =
  {
   {0,1,2},
   {3,4,5},
   {6,7,8}
  };

これはCでもC++でもこのように書けます.

std::array を使った場合

C++11の範囲指定 for 文を使い始めたら配列を index でなめるようなコード書くが面倒になりました.

そんなわけで先に書いた配列を std::array で書きなおします.

const std::array <struct hoge, 3> hoge_array1 =
  {
   {0,1,2},
   {3,4,5},
   {6,7,8}
  };

このコードをコンパイルすると、あれれ?こんなエラーで怒られる…

[terminal]
$ g++  -g   array_test.cpp   -o array_test
array_test.cpp:23:3: error: too many initializers for ‘const std::array<hoge, 3>’
   };
   ^
[/terminal]

ううむ

error: too many initializers

とは、何が悪いのか?

修正した std::array を使ったコード

いろいろ調べた結果,どうも中カッコ {} がもう一組必要なのです.

修正したコードがこれ.

const std::array <struct hoge, 3> hoge_array1 =
  {
   {
    {0,1,2},
    {3,4,5},
    {6,7,8}
   }
  };

そうかぁ,配列と std::arrayは同じモノだと勝手に思い込んでましたが、こういう違いがあるんだ…

最初の中カッコの組はstd::array クラスのコンストラクタとして呼出し,その次の中カッコは配列全体を取り囲むために中カッコの組が必要なのでは…と理解してますが…

まだまだ勉強が足りません…まだまだC++の修行が必要なようです.

それでは