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.

Examples

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.

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, replace all instances of the template parameter in the specialization with the explicitly specialized type.

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
};