コンパイラ エラー C2146
構文エラー: 識別子 'identifier' の前に 'token' がありません
コンパイラでは token
が必要でしたが、代わりに identifier
が検出されました。 考えられる原因:
スペルまたは大文字小文字のエラー。
識別子の宣言に型指定子がない。
このエラーは、文字入力エラーが原因で発生する可能性があります。 通常、エラー C2065 がこのエラーの前にあります。
例
次の例では C2146 が生成されます。
// C2146.cpp
class CDeclaredClass {};
class CMyClass {
CUndeclared m_myClass; // C2146
CDeclaredClass m_myClass2; // OK
};
int main() {
int x;
int t x; // C2146 : missing semicolon before 'x'
}
このエラーは、Visual Studio .NET 2003 で実行されたコンパイラの準拠作業で、typename
キーワードの不足の結果として生成される可能性もあります。
次の例は Visual Studio .NET 2002 ではコンパイルされますが、Visual Studio .NET 2003 では失敗します。
// C2146b.cpp
// compile with: /c
template <typename T>
struct X {
struct Y {
int i;
};
Y memFunc();
};
template <typename T>
X<T>::Y func() { } // C2146
// OK
template <typename T>
typename X<T>::Y func() { }
また、このエラーは Visual Studio .NET 2003 で実行されたコンパイラ準拠作業で、明示的な特殊化によってプライマリテン プレートからテンプレートパラメーターが見つからなくなった結果としても表示されます。
プライマリ テンプレートからの T
の使用は、明示的な特殊化では許可されていません。 Visual Studio .NET 2003 および Visual Studio .NET でコードを有効にするには、特殊化のテンプレート パラメーターのすべてのインスタンスを明示的に特殊化された型に置き換えます。
次の例は Visual Studio .NET ではコンパイルされますが、Visual Studio .NET 2003 では失敗します。
// C2146_c.cpp
// compile with: /c
template <class T>
struct S;
template <>
struct S<int> {
T m_t; // C2146
int m_t2; // OK
};