えたこと、その他を雑記するためのブログです。C++STLちゃんと使ってますかー?自分は結構std::array使います。いうか基本、C言語の人が生配列使いたいなーって思うところが全部std::arrayに置き換わる感じです。今日もこんな感じでテーブルをstd::arrayで作って、色々と計算に使ったりしました。'\n';}コメントにも書いたとおり、生配列の記法+便利(というかCが不自由すぎ)な機能があるのでナイスです。今日はたくさんテーブルを作って計算してたのですがその内の一つの処理が少し複雑だったので、std::arrayはクラスに持たせて複雑な処理はそこにまとめ、main内はすっきり書けるようにしたいなあと思いました。tbl;tbl.print();}え?動かない、というかコンパイルが通らないというのが今日の困り事でした。調べたら思ったよりも沼という感じだったので、結論から言うと下記のコードは動きます。tbl;tbl.print();}コメントで色々試してみたりしたものを置いておきました。エラー内容やコンパイルOKかどうかが変わります。そもそも(1)と(2)のm_data={~}型の初期化は使えません。(1)か(2)のとき、C2797のコンパイルエラーが出ます。これについての説明は以下です。C2797この書き方が実装されてないみたいです。実装されていないなら仕方がないです。下の方に記述がありますが、明示的にコンストラクタを呼び出して初期化、という感じで解決するようです。}で解決、と思いますよねところが、さっきの(1)および(3)ではC2797の他にもう一つエラーが出ます。このサブオブジェクト初期化子では中かっこを省略できません"というものです。面白いのは(?)このエラーはコンパイルエラーにはならないところです。(1)はコンパイルエラー、(3)はコンパイルは通り、プログラムが問題なく動くのです。いうことはコンパイルを妨げるのはC2797だけ、ということです。中括弧が1重だと、中かっこを省略できません~のエラーが出ます。この中かっこが1重か2重か?ってのが色々面白そうです。{initializer-list};の形で初期化できるもの、と書いてあるので(メンバ変数内宣言時の初期化とは言え)1重でエラー出すのはどうなんだ?と思ったりもしないのですが、集成体(aggregate)の初期化時の中かっこの省略が、メンバ変数の宣言時初期化だとできないようになってるのかな?とか色々思いました。こと考えてると†闇†が深くなってくるので、まあVS2013なら(4)でちゃんと動きます。4.9.2では(2)でちゃんと動きますが、(1)はコンパイルが通りませんでした。(2)のコンパイルは通るものの、-Wallオプション付きだとmain内での中かっこ1重の初期化、および(1)について、警告が出る状態でした。コンパイラで色々違いが出たり、初期化子リストやaggregate等、調べたら結構勉強になりました。詳しい所もまた書きたいと思います。えたこと、その他を雑記するためのブログです。(1)月別アーカイブリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!milk_spoonさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。