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
}