Erro do compilador C2146

Erro de sintaxe: 'token' ausente antes do identificador 'identifier'

Em vez disso, o compilador esperava token e, em vez disso, foi encontrado identifier. Possíveis causas:

  1. Erro de ortografia ou uso de capitalização.

  2. Especificador de tipo ausente na declaração do identificador.

Esse erro pode ser causado por um erro tipógrafo. O erro C2065 geralmente precede esse erro.

Exemplos

O seguinte exemplo gera o erro 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'
}

Esse erro também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio .NET 2003: palavra-chave typename ausente.

O exemplo a seguir é compilado no Visual Studio .NET 2002, mas falhará no 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() { }

Você também verá esse erro como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio .NET 2003: especializações explícitas não encontram mais parâmetros de modelo do modelo primário.

O uso do modelo primário T não é permitido na especialização explícita. Para que o código seja válido no Visual Studio .NET 2003 e no Visual Studio .NET, substitua todas as instâncias do parâmetro de modelo na especialização pelo tipo explicitamente especializado.

O exemplo a seguir é compilado no Visual Studio .NET, mas falhará no 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
};