Compiler Error C2146
The latest version of this topic can be found at Compiler Error C2146.
syntax error : missing 'token' before identifier 'identifier'
The compiler expected token
and found identifier
instead. Possible causes:
Spelling or capitalization error.
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'
}
Example
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() { }
Example
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.
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
};