다음을 통해 공유


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