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