Error del compilador C2146
Actualización: noviembre 2007
Mensaje de error
error de sintaxis: falta 'símbolo (token)' delante del identificador 'identificador'
syntax error : missing 'token' before identifier 'identifier'
El compilador esperaba token y encontró identifier en su lugar. Causas posibles:
Error de escritura o de uso de mayúsculas.
Falta el especificador de tipo en la declaración del identificador.
Este error podría deberse a un error tipográfico. El error C2065 suele preceder a este error.
Ejemplo
El ejemplo siguiente genera el error 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'
}
Este error también puede producirse como resultado del trabajo de compatibilidad del compilador realizado para Visual Studio .NET 2003: falta la palabra clave typename. Para obtener más información, vea Resumen de cambios importantes en tiempo de compilación.
El siguiente ejemplo compila en Visual Studio .NET 2002, pero genera errores en 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() { }
También podrá ver este error como resultado de un trabajo de compatibilidad del compilador realizado para Visual Studio .NET 2003: las especializaciones explícitas ya no buscan parámetros de plantilla desde plantillas principales.
En la especialización explícita no se permite el uso de T desde la plantilla principal. Para que el código sea válido en las versiones Visual Studio .NET 2003 y Visual Studio .NET de Visual C++, reemplace todas las instancias del parámetro de plantilla en la especialización por el tipo especializado explícitamente.
Vea Resumen de cambios importantes en tiempo de compilación para obtener más información.
El código de ejemplo siguiente se compila en Visual Studio .NET, pero genera errores en 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
};