Partilhar via


Erro do compilador C2146

erro de sintaxe: falta 'token' antes do identificador 'identifier'

Observações

O compilador esperava token e encontrava identifier em vez disso. Causas possíveis:

  1. Erro de ortografia ou maiúsculas.

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

Este erro pode ser causado por um erro tipográfico. O erro C2065 geralmente precede esse erro.

Exemplos

O exemplo a seguir gera 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 erro também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para Visual Studio .NET 2003: palavra-chave ausente typename .

O exemplo a seguir compila 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 T do modelo primário não é permitido na especialização explícita. Para que o código seja válido no Visual Studio .NET 2003 e Visual Studio .NET, substitua todas as instâncias do parâmetro de modelo na especialização pelo tipo explicitamente especializado.

O exemplo a seguir compila 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
};