Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
}