다음을 통해 공유


컴파일러 오류 C2059

구문 오류: 'token'

토큰으로 인해 구문 오류가 발생했습니다.

다음 예제에서는 선언하는 줄에 대한 오류 메시지를 생성합니다 j.

// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
   int j*; // C2059

오류의 원인을 확인하려면 오류 메시지에 나열된 줄뿐만 아니라 위의 줄도 검사합니다. 선을 검사해도 문제에 대한 단서가 없는 경우 오류 메시지에 나열된 줄과 그 위에 있는 여러 줄을 주석으로 처리해 보세요.

변수 바로 뒤에 있는 기호에서 오류 메시지가 발생하는 경우 변수가 소스 코드에 정의되어 있는지 확인합니다 typedef .

C2059는 전처리기 기호 이름을 식별자로 다시 사용할 때 발생합니다. 다음 예제에서 컴파일러는 열거형 요소 이름으로 유효하지 않은 숫자 1로 표시됩니다 DIGITS.ONE .

#define ONE 1

enum class DIGITS {
    ZERO,
    ONE // error C2059
};

/D= 기호를 사용하여 컴파일할 때 발생할 수 있는 것처럼 기호가 아무것도 계산되지 않으면 C2059를 가져올 수 있습니다.

// C2059a.cpp
// compile with: /DTEST=
#include <stdio.h>

int main() {
   #ifdef TEST
      printf_s("\nTEST defined %d", TEST);   // C2059
   #else
      printf_s("\nTEST not defined");
   #endif
}

C2059가 발생할 수 있는 또 다른 경우는 함수에 대한 기본 인수의 구조를 지정하는 애플리케이션을 컴파일하는 경우입니다. 인수의 기본값은 식이어야 합니다. 구조체를 초기화하는 데 사용되는 이니셜라이저 목록(예: 이니셜라이저 목록)은 식이 아닙니다. 이 문제를 해결하려면 필요한 초기화를 수행할 생성자를 정의합니다.

다음 예제에서는 C2059를 생성합니다.

// C2059b.cpp
// compile with: /c
struct ag_type {
   int a;
   float b;
   // Uncomment the following line to resolve.
   // ag_type(int aa, float bb) : a(aa), b(bb) {}
};

void func(ag_type arg = {5, 7.0});   // C2059
void func(ag_type arg = ag_type(5, 7.0));   // OK

C2059는 잘못된 형식의 캐스트에 대해 발생할 수 있습니다.

다음 샘플에서는 C2059를 생성합니다.

// C2059c.cpp
// compile with: /clr
using namespace System;
ref class From {};
ref class To : public From {};

int main() {
   From^ refbase = gcnew To();
   To^ refTo = safe_cast<To^>(From^);   // C2059
   To^ refTo2 = safe_cast<To^>(refbase);   // OK
}

마침표가 포함된 네임스페이스 이름을 만들려는 경우에도 C2059가 발생할 수 있습니다.

다음 샘플에서는 C2059를 생성합니다.

// C2059d.cpp
// compile with: /c
namespace A.B {}   // C2059

// OK
namespace A  {
   namespace B {}
}

C2059는 이름(::->.)을 한정할 수 있는 연산자 뒤에 키워드template가 와야 할 때 발생할 수 있습니다.

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::Rebind<X>::Other AX; // error C2059
};

기본적으로 C++는 AY::Rebind이 템플릿이 아니라고 가정하기 때문에 다음 <는 보다 작음 기호로 해석됩니다. 꺾쇠 괄호로 올바르게 구문 분석될 수 있도록 Rebind이 템플릿임을 컴파일러에 명시적으로 알려야 합니다. 이 오류를 해결하려면 다음과 같이 종속 형식의 이름에서 template 키워드를 사용합니다.

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::template Rebind<X>::Other AX; // correct
};