컴파일러 오류 C2143
구문 오류: 'token2' 앞에 'token1'이 없습니다.
컴파일러는 특정 토큰(즉, 공백 이외의 언어 요소)을 예상했고 대신 다른 토큰을 찾았습니다.
C++ 언어 참조를 확인하여 코드가 구문적으로 잘못된 위치를 확인합니다. 컴파일러가 문제를 일으키는 줄이 발생한 후 이 오류를 보고할 수 있으므로 오류 앞에 오는 여러 코드 줄을 확인합니다.
C2143은 다양한 상황에서 발생할 수 있습니다.
다음 예제와 같이 이름(::
, ->
및 .
)을 정규화할 수 있는 연산자 다음에 키워드 template
이 와야 하는 경우에 발생할 수 있습니다.
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
기본적으로 C++는 Ty::PutFuncType
이 템플릿이 아니라고 가정하기 때문에 다음 <
는 보다 작음 기호로 해석됩니다. 꺾쇠 괄호로 올바르게 구문 분석될 수 있도록 PutFuncType
이 템플릿임을 컴파일러에 명시적으로 알려야 합니다. 이 오류를 해결하려면 다음과 같이 종속 형식의 이름에서 template
키워드를 사용합니다.
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
/clr을 사용하고 using
지시문에 구문 오류가 있는 경우 C2143이 발생할 수 있습니다.
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
/clr을 사용하지 않고 CLR 구문을 사용하여 소스 코드 파일을 컴파일하려고 할 때도 발생할 수 있습니다.
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
if
문 다음에 오는 첫 번째 비공백 문자는 왼쪽 괄호여야 합니다. 컴파일러는 다른 어떤 것도 번역할 수 없습니다.
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
C2143은 오류가 검색된 줄 또는 윗줄 중 하나에서 닫는 중괄호, 괄호 또는 세미콜론이 누락된 경우 발생할 수 있습니다.
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
또는 클래스 선언에 잘못된 태그가 있는 경우:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
또는 레이블이 문에 첨부되지 않은 경우. 예를 들어 복합 문 끝에 레이블을 단독으로 배치해야 하는 경우 null 문에 연결합니다.
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
C++ 표준 라이브러리의 형식에 대해 정규화되지 않은 호출이 수행되면 오류가 발생할 수 있습니다.
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
또는 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();
}
또는 명시적 인스턴스화를 정의하려고 한 경우:
// 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
C 프로그램에서 변수는 함수의 시작 부분에서 선언되어야 하며 함수가 선언되지 않은 명령을 실행한 후에는 선언할 수 없습니다.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}