Error del compilador C2146

error de sintaxis: falta "token" delante del identificador "identifier"

El compilador esperaba token y encontró identifier en su lugar. Causas posibles:

  1. Error ortográfico o de mayúsculas.

  2. Falta el especificador de tipo en la declaración del identificador.

Este error puede deberse a un error tipográfico. El error C2065 suele preceder a este error.

Ejemplos

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 deberse a una operación de conformidad del compilador para Visual Studio .NET 2003: falta la palabra clave typename.

El ejemplo siguiente se compila en Visual Studio .NET 2002, pero se producirá un error 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 verá este error como resultado del trabajo de conformidad del compilador que se realizó para Visual Studio .NET 2003: las especializaciones explícitas ya no encuentran parámetros de plantilla en la plantilla principal.

No se permite el uso de T desde la plantilla principal en la especialización explícita. Para que el código sea válido en Visual Studio .NET 2003 y Visual Studio .NET, reemplace todas las instancias del parámetro de plantilla en la especialización por el tipo especializado explícitamente.

El ejemplo siguiente se compila en Visual Studio .NET, pero se producirá un error 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
};