Partilhar via


Erro do compilador C2143

Erro de sintaxe: faltando 'token1' antes de 'token2'

Observações

O compilador esperava um token específico (ou seja, um elemento de linguagem diferente do espaço em branco) e encontrou outro token em vez disso.

Verifique a Referência da linguagem C++ para determinar onde o código está sintaticamente incorreto. Como o compilador pode relatar esse erro depois de encontrar a linha que causa o problema, verifique várias linhas de código que precedem o erro.

C2143 pode ocorrer em diferentes situações.

Exemplos

Pode ocorrer quando um operador que pode qualificar um nome (::, ->, e .) deve ser seguido pela palavra-chave template, como neste exemplo:

class MyClass
{
    template<class Ty, typename PropTy>
    struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
    {
    };
};

Por padrão, o C++ assume que Ty::PutFuncType não é um modelo, portanto, o seguinte < é interpretado como um sinal de menos. Você deve dizer ao compilador explicitamente que PutFuncType é um modelo para que ele possa analisar corretamente o colchete angular. Para corrigir esse erro, use a template palavra-chave no nome do tipo dependente, conforme mostrado aqui:

class MyClass
{
    template<class Ty, typename PropTy>
    struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
    {
    };
};

C2143 pode ocorrer quando /clr é usado e uma using diretiva tem um erro de sintaxe:

// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection;   // C2143
using namespace System::Reflection;

Também pode ocorrer quando você está tentando compilar um arquivo de código-fonte usando a sintaxe CLR sem também usar /clr:

// C2143b.cpp
ref struct A {   // C2143 error compile with /clr
   void Test() {}
};

int main() {
   A a;
   a.Test();
}

O primeiro caractere sem espaço em branco que segue a instrução if deve ser um parêntese esquerdo. O compilador não pode traduzir mais nada:

// C2143c.cpp
int main() {
   int j = 0;

   // OK
   if (j < 25)
      ;

   if (j < 25)   // C2143
}

C2143 pode ocorrer quando uma chave de fechamento, parêntese ou ponto-e-vírgula está faltando na linha onde o erro é detetado ou em uma das linhas logo acima:

// C2143d.cpp
// compile with: /c
class X {
   int member1;
   int member2   // C2143
} x;

Ou quando há uma tag inválida em uma declaração de classe:

// C2143e.cpp
class X {
   int member;
} x;

class + {};   // C2143 + is an invalid tag name
class ValidName {};   // OK

Ou quando um rótulo não é anexado a uma declaração. Se você precisar colocar um rótulo por si só, por exemplo, no final de uma instrução composta, anexe-o a uma instrução null:

// C2143f.cpp
// compile with: /c
void func1() {
   // OK
   end1:
      ;

   end2:   // C2143
}

O erro pode ocorrer quando uma chamada não qualificada é feita para um tipo na biblioteca padrão C++:

// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad;   // C2143
static std::vector<char> good;   // OK

Ou falta uma typename palavra-chave:

// C2143h.cpp
template <typename T>
struct X {
   struct Y {
      int i;
   };
   Y memFunc();
};
template <typename T>
X<T>::Y X<T>::memFunc() {   // C2143
// try the following line instead
// typename X<T>::Y X<T>::memFunc() {
   return Y();
}

Ou se você tentar definir uma instanciação explícita:

// C2143i.cpp
// compile with: /EHsc /c
// template definition
template <class T>
void PrintType(T i, T j) {}

template void PrintType(float i, float j){}   // C2143
template void PrintType(float i, float j);   // OK

Em um programa C, as variáveis devem ser declaradas no início da função, e elas não podem ser declaradas depois que a função executa instruções de não-declaração.

// C2143j.c
int main()
{
    int i = 0;
    i++;
    int j = 0; // C2143
}