Compartir a través de


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:

  1. Error de escritura o de uso de mayúsculas.

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