1

(Visual Studio 2010 で) C2057 エラーが発生しましたが、その理由がわかりません。スタック上の配列を初期化するには、コンパイル時にサイズを知る必要があるため、const 値を使用する必要があることを理解しています (少なくとも Visual Studio では、可変長配列は gcc のように許可されていないため)。クラスに const 値メンバーがあり、初期化リストでその値を定義します。技術的には、値はコンパイル時にわかりますよね? うまくいかない理由を知りたいのですが?ここにスニペットがあります:

class Dummy
{
    Dummy() : size(4096) {}

    void SomeFunction()
    {
        int array[size]; //return C2057 
        //...
    }

    const unsigned int size;
};

ありがとう

4

3 に答える 3

7

残念ながら、このconst値はコンパイル時定数ではありません。列挙型、静的積分型、またはC++11が必要になりますconstexpr

もう1つのオプションは、Dummy型以外のパラメーターを使用してクラステンプレートを作成することです。

template <unsigned int SIZE>
class Dummy
{
    void SomeFunction()
    {
        int array[SIZE];
        //...
    }
};
于 2012-08-01T18:58:29.993 に答える
5

sizeはconstですが、コンパイル時に4096であることがわかりません。

デフォルトのコンストラクターはサイズ4096のダミーを作成しますが、ダミークラスは別のサイズで構築されていないと誰が言いますか?異なるサイズを許可する別のコンストラクターがあった場合、コンパイラーはそれsizeが常に4096であると想定できなかったため、代わりにコンパイル時エラーが発生します。

于 2012-08-01T18:57:33.427 に答える
2

すべてのオブジェクトに対して同じ値を持つconstデータメンバーを持つことは、おそらくあなたが望むものではありません。クラスにシンボリック定数をネストする場合は、次の2つのオプションがあります。

class Dummy
{
    // ...

    static const unsigned int size = 4096;
    enum { another_size = 4096 };
};
于 2012-08-02T05:44:35.750 に答える