コンパイラ エラー C2059
更新 : 2007 年 11 月
エラー メッセージ
構文エラー : 'token'
トークンが構文エラーを引き起こしました。
原因を判断するには、エラー メッセージで示された行だけでなく、その前の数行もチェックしてください。次の例では、j を宣言している行に対してエラー メッセージが生成されますが、実際のエラーの原因はその直前の行にあります。
エラー メッセージに記述されている行を調べてもエラーの原因がつかめない場合は、その行とその前の数行をコメント アウトしてください。
typedef 変数の直後に記述されているシンボルでエラーが発生している場合は、その変数がソース コード内で宣言されていることを確認してください。
シンボルに何も指定されていないと評価される場合は、/Dsymbol**=** を指定してコンパイルしたときと同じように、C2059 エラーが発生することがあります。
// C2059a.cpp
// compile with: /DTEST=
#include <stdio.h>
int main() {
#ifdef TEST
printf_s("\nTEST defined %d", TEST); // C2059
#else
printf_s("\nTEST not defined");
#endif
}
関数の既定の引数に構造体を指定するアプリケーションをコンパイルした場合にも C2059 のエラーが発生します。引数の既定値は式であることが必要です。たとえば、構造体の初期化に使用される初期化子リストは式ではありません。このエラーを解決するには、必要な初期化処理を実行するコンストラクタを定義してください。
次のコードは C2059 を生成します。
// C2059b.cpp
// compile with: /c
struct ag_type {
int a;
float b;
// Uncomment the following line to resolve.
// ag_type(int aa, float bb) : a(aa), b(bb) {}
};
void func(ag_type arg = {5, 7.0}); // C2059
void func(ag_type arg = ag_type(5, 7.0)); // OK
メンバのテンプレート クラスまたは関数をクラスの外側に定義した場合にも C2059 エラーが発生します。詳細については、サポート技術情報の「BUG: C2059 Error on Out-Of-Class Definition of Member Templates (Q241949)」を参照してください。
C2059 は、不正な形式のキャストが原因で発生することがあります。
次の例では C2059 エラーが生成されます。
// C2059c.cpp
// compile with: /clr
using namespace System;
ref class From {};
ref class To : public From {};
int main() {
From^ refbase = gcnew To();
To^ refTo = safe_cast<To^>(From^); // C2059
To^ refTo2 = safe_cast<To^>(refbase); // OK
}
C2059 は、名前空間の名前にピリオドを含めて作成しようとした場合にも発生します。
次の例では C2059 エラーが生成されます。
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
メンバのテンプレート クラスまたは関数をクラスの外側に定義した場合にも C2059 エラーが発生します。詳細については、サポート技術情報の「BUG: C2059 Error on Out-Of-Class Definition of Member Templates (Q241949)」を参照してください。サポート技術情報の文書は、MSDN ライブラリ CD-ROM または https://support.microsoft.com で参照できます。