编译器错误 C2146

语法错误:标识符“identifier”的前面缺少“token”

编译器预期 token,却找到了 identifier。 可能的原因:

  1. 拼写或大小写错误。

  2. 标识符声明中缺少类型说明符。

此错误可能是由录入错误导致的。 错误 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
};