Error del compilador C2143
error de sintaxis: falta 'token1' delante de 'token2'
El compilador esperaba un token específico (es decir, un elemento de lenguaje distinto del espacio en blanco) y ha encontrado otro token en su lugar.
Consulte la Referencia del lenguaje C++ para determinar dónde está el error sintáctico en el código. Dado que el compilador puede notificar este error después de encontrar la línea que causa el problema, compruebe varias líneas de código que precedan al error.
El error C2143 puede producirse en diferentes situaciones.
Puede producirse cuando un operador que puede proporcionar un nombre completo (::
, ->
y .
) debe ir seguido de la palabra clave template
, como en este ejemplo:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
De forma predeterminada, C++ supone que Ty::PutFuncType
no es una plantilla; por lo tanto, el siguiente <
se interpreta como un signo menor que. Debe indicarle al compilador explícitamente que PutFuncType
es una plantilla, para que pueda analizar correctamente el corchete angular. Para corregir este error, use la palabra clave template
en el nombre del tipo dependiente, como se muestra aquí:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
El error C2143 puede producirse cuando se usa /clr y una directiva using
tiene un error de sintaxis:
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
También puede ocurrir cuando se intenta compilar un archivo de código fuente con la sintaxis de CLR sin usar también /clr:
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
El primer carácter que no es un espacio en blanco después de una instrucción if
debe ser un paréntesis de apertura. El compilador no puede traducir nada más:
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
El error C2143 puede producirse cuando falta una llave, un paréntesis o un punto y coma de cierre en la línea donde se detecta el error o en una de las líneas inmediatamente anteriores:
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
O cuando hay una etiqueta no válida en una declaración de clase:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
O cuando una etiqueta no está asociada a una instrucción. Si debe colocar una etiqueta por sí sola, por ejemplo, al final de una instrucción compuesta, asóciela a una instrucción null:
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
El error puede producirse cuando se realiza una llamada no calificada a un tipo en la biblioteca estándar de C++:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
O bien falta una palabra clave 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();
}
O bien si intenta definir una creación de instancia 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
En un programa de C, las variables deben declararse al principio de la función y no se pueden declarar después de que la función ejecute instrucciones que no sean de declaración.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}