コンパイラ エラー C2059
構文エラー: 'token'
トークンによって構文エラーが発生しました。
j
を宣言する行のエラー メッセージを生成する例を次に示します。
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
エラーの原因を特定するには、エラー メッセージに一覧表示されている行だけでなく、その上の行も調べてください。 行を調べても問題に関する手がかりが得られなかった場合は、エラー メッセージに一覧表示されている行と、その上の数行をコメントアウトしてみてください。
typedef
変数の直後のシンボルでエラー メッセージが表示される場合は、変数がソース コードで定義されていることを確認してください。
C2059 は、プリプロセッサ シンボル名が識別子として再使用される場合に発生します。 次の例では、コンパイラでは DIGITS.ONE
が数値 1 と見なされます。これは列挙要素名として有効ではありません。
#define ONE 1
enum class DIGITS {
ZERO,
ONE // error C2059
};
/Dsymbol= を使用してコンパイルするときに発生する可能性がある、シンボルが nothing と評価される場合は、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 が発生するもう 1 つのケースは、関数の既定の引数で構造体を指定するアプリケーションをコンパイルする場合です。 引数の既定値は式である必要があります。 初期化子リスト (構造体の初期化に使用した初期化子リストなど) は式ではありません。 この問題を解決するには、必要な初期化を実行するコンストラクターを定義します。
次の例では 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 は、形式が不正なキャストに対して発生する可能性があります。
次の例では 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 {}
}
この例のように、名前を修飾できる演算子 (::
、->
、.
) の後に キーワード template
を指定する必要がある場合に C2059 が発生する可能性があります。
template <typename T> struct Allocator {
template <typename U> struct Rebind {
typedef Allocator<U> Other;
};
};
template <typename X, typename AY> struct Container {
typedef typename AY::Rebind<X>::Other AX; // error C2059
};
既定で、C++ では AY::Rebind
がテンプレートではないと見なされます。したがって、次の <
は小なり記号として解釈されます。 正しく角かっこを解析できるよう、Rebind
がテンプレートであることを明示的にコンパイラに伝える必要があります。 このエラーを修正するには、次に示すように、依存型の名前に template
キーワードを使用します。
template <typename T> struct Allocator {
template <typename U> struct Rebind {
typedef Allocator<U> Other;
};
};
template <typename X, typename AY> struct Container {
typedef typename AY::template Rebind<X>::Other AX; // correct
};