컴파일러 오류 C2653
'identifier': 클래스 또는 네임스페이스 이름이 아닙니다.
언어 구문에는 클래스, 구조체, 공용 구조체 또는 네임스페이스 이름이 필요합니다.
이 오류는 범위 연산자 앞에서 클래스, 구조체, 공용 구조체 또는 네임스페이스로 선언되지 않은 이름을 사용할 때 발생할 수 있습니다. 이 문제를 해결하려면 이름을 선언하거나 이름을 사용하기 전에 선언하는 헤더를 포함합니다.
하나 이상의 범위 중첩 네임스페이스 이름을 포함하는 네임스페이스인 복합 네임스페이스를 정의하려는 경우에도 C2653이 가능합니다. C++17 이전에는 C++에서 복합 네임스페이스 정의가 허용되지 않습니다. 컴파일러 옵션을 지정할 때 Visual Studio 2015 업데이트 3부터 복합 네임스페이 /std:c++latest
스가 지원됩니다. Visual Studio 2017 버전 15.5부터 컴파일러는 ](.) 시 [/std:c++17
복합 네임스페이스 정의를 지원합니다. /.. /build/reference/std-specifi-language-standard-version.md) 이상 옵션이 지정됩니다.
예제
이 샘플에서는 범위 이름이 사용되지만 선언되지 않았기 때문에 C2653을 생성합니다. 컴파일러는 범위 연산자(::) 앞에 클래스, 구조체, 공용 구조체 또는 네임스페이스 이름이 필요합니다.
// C2653.cpp
// compile with: /c
class yy {
void func1(int i);
};
void xx::func1(int m) {} // C2653, xx is not declared
void yy::func1(int m) {} // OK
C++17 이상 표준에 대해 컴파일되지 않은 코드에서 중첩된 네임스페이스는 각 중첩 수준에서 명시적 네임스페이스 선언을 사용해야 합니다.
// C2653b.cpp
namespace a::b {int i;} // C2653 prior to Visual Studio 2015 Update 3,
// C2429 thereafter. Use /std:c++17 or /std:c++latest to fix.
namespace a { // Use this form for conformant code under /std:c++14 (the default)
namespace b { // or when using compilers before Visual Studio 2015 update 3.
int i;
}
}
int main() {
a::b::i = 2;
}