컴파일러 오류 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
}