Compartilhar via


Erro do compilador C2143

erro de sintaxe: “token1” ausente antes de “token2”

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

Verifique a Referência de 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 situações diferentes.

Ele 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++ pressupõe que Ty::PutFuncType não seja um modelo; portanto, o < seguinte é interpretado como um sinal de menor que. Você precisa informar ao compilador explicitamente que PutFuncType é um modelo, para que ele possa analisar corretamente o colchete angular. Para corrigir esse erro, use a palavra-chave template no nome do tipo dependente, conforme mostrado aqui:

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

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

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

Também pode ocorrer ao tentanr compilar um arquivo de código-fonte com a sintaxe CLR sem usar /clr:

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

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

O primeiro caractere não espaço em branco que segue uma instrução if precisa ser um parêntese à esquerda. O compilador não pode traduzir mais nada:

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

   // OK
   if (j < 25)
      ;

   if (j < 25)   // C2143
}

O C2143 pode ocorrer quando uma chave, parênteses ou ponto-e-vírgula de fechamento está ausente na linha em que o erro é detectado ou em uma das linhas logo acima:

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

Ou quando há uma marca 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 está anexado a uma instruçã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 nula:

// 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 há uma palavra-chave ausente typename:

// 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 precisam ser declaradas no início da função e não podem ser declaradas após a função executar instruções de não declaração.

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