Compiler Error C2146

syntax error : missing 'token' before identifier 'identifier'

The compiler expected token and found identifier instead. Possible causes:

  1. Spelling or capitalization error.

  2. Missing type specifier in the declaration of the identifier.

This error may be caused by a typographical error. Error C2065 usually precedes this error.

Example

The following sample generates 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'
}

This error can also be generated as a result of compiler conformance work that was done for Visual Studio .NET 2003: missing typename keyword. See Summary of Compile-Time Breaking Changes for more information.

The following sample compiles in Visual Studio .NET 2002 but will fail in 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() { }

You will also see this error as a result of compiler conformance work that was done for Visual Studio .NET 2003: explicit specializations no longer find template parameters from primary template.

The use of T from the primary template is not allowed in the explicit specialization. For code to be valid in the Visual Studio .NET 2003 and Visual Studio .NET versions of Visual C++, replace all instances of the template parameter in the specialization with the explicitly specialized type.

See Summary of Compile-Time Breaking Changes for more information.

The following sample compiles in Visual Studio .NET but will fail in 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
};