编译器错误 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
};