2014-01-16 20 views
19

まず:あまりにも多くの初期化子C++

int k[] ={1,2,3,4,5}; 

第二:これら二つの文のための

struct slk 
{ 
    int k[] ={1,2,3,4,5}; 
}; 

、最初のものは、コンパイルが、二番目の弾力を通過しない理由私

error:too many initializers for 'int [0]'. the compilation would passed if I set k[5];

このエラーメッセージは何を意味しますか?注:GNU GCCバージョン4.7.2でテストされたコード

+4

メンバーのインライン初期化は、まったく別のボールゲームです。あなたの最初のサンプルに直接相当するものを取得するには、_member初期化リストのメンバを初期化する必要があります(ただし、2番目のサンプルと同じようにインラインで行うことはできます)。 –

+0

これは 'int k [5] = {1,2,3,4,5}; 'で動作するようですが、理由を説明できません。 – ValarDohaeris

+0

@ValarDohaeris、それは「それはクラスでそれを行うには大きさが必要です」ということです。 IIRCでは、標準に明示的なルールがあります。 – chris

答えて

20

は、クラスメンバの初期化子は許可されるが、基本的にメンバー初期化リストに初期化と同じように作用します。したがって、配列のサイズは明示的に述べなければなりません。

Stroustrupのウェブサイトに関する短い説明があるhereです。

エラーメッセージは、長さ0の配列にあまりにも多くのアイテムを提供していることを意味します。これは、そのコンテキストでint []が評価されるアイテムです。

最初に(初期化剤句を使用して)変数の宣言である。

0

おそらくstructに原因があります。コンパイラは、サイズを明示的に指定する必要があります。 C++ 11では

C initialize array within structure(しゃれが意図)

1

これらは2つの完全に異なるコンテキストです。

2つ目はタイプ定義です。

3

最初の例では、何か(実際のメモリ割り当て)が実際に起こっています。コンピュータは、それに与えられたアイテムの数を容易に数え、それを容量として使用する。 2番目の使用では、構造体の一部として、配列は単に構造体のテンプレートの一部です。 2番目のケースでは、コンパイル時にサイズを明示的に指定して知らなければなりません。ここに自動カウントはありません。宣言と変数の宣言(型を教えていますが、メモリはそのままです)と呼び出し/使用(プログラムが動作する場所)と同様に、宣言と関数を同じように扱います。

+0

私はそれを愚かにしています。同一の構造であり、コンパイラはあるケースでサイズを推測できますが、他のケースではサイズを推測できません。どのように矛盾しているのですか? –

関連する問題