6

私はこのコードを持っています

typedef struct
{
    const char* fooString;
    const bool  fooBool;
}fooStruct;

そして、このイニシャライザ:

static const fooStruct foo[] =
{
    {"file1", true},
    {"file2", false},
    ....
};

このコードを使用すると、VS2008 で 3 つの警告が表示されます。

error C2220: warning treated as error - no 'object' file generated  
warning C4510: '<unnamed-tag>' : default constructor could not be generated
warning C4512: '<unnamed-tag>' : assignment operator could not be generated
warning C4610: struct '<unnamed-tag>' can never be instantiated - user defined constructor required 
4

3 に答える 3

11

これはまさにコンパイラーが言うことです。構造体にはconstメンバーが含まれているため、構造体のデフォルトのコンストラクターまたは代入演算子を生成できません(const bool fooBool)。参照である、または参照である構造体メンバーはconstデフォルトで初期化できないため、ユーザー作成のコンストラクターまたは代入演算子で明示的に初期化する必要があります。

1つの解決策は、独自のデフォルトのコンストラクターと代入演算子を作成することです(3つのルールに従って、コピーコンストラクターも作成する必要があります。デストラクタは厳密には必要ありませんが、良い習慣です)。別の、より簡単な解決策はfooBool、非を作成することconstです。次に、コンパイラーはデフォルトのコンストラクターと代入演算子を喜んで生成します。

constでこれらのインスタンスの配列をすでに作成しているのでstatic const fooStruct foo[] = ...、余分なconstものfooBoolは無意味です。

于 2011-08-22T17:50:08.947 に答える
8

C4610 の警告は正しくありません。これは、Visual C++ の既知のバグです。Microsoft Connect のバグ「C4610 の不適切な発行」を参照してください。

Adam Rosenfield は、他の 2 つの警告 (C4510 と C4512) が出力される理由を説明しています。

于 2011-08-22T17:51:33.090 に答える
0

また、部分的な初期化を行うと、MSVC2008は(MSVC2010と同様に)エラーをスローします。これは、C++03およびC++11で定義されている誤った動作です。私はあなたがここで読むことができるスタックオーバーフローの別のスレッドでこれについてもっと投稿しました

// Partial initialization, leaving it to the compiler
// to do aggregate value-initialization
fooStruct foo ={"file1", /*missing true/false, compiler should set false*/ };

MSVCは、あなたが言及した警告とともに、このコードでエラーをスローします。

于 2012-01-06T04:28:58.907 に答える