컴파일러 경고(수준 1) C5208 및 오류 C7626
typedef 이름에 사용되는 명명되지 않은 클래스는 비정적 데이터 멤버, 멤버 열거형 또는 멤버 클래스 이외의 멤버를 선언할 수 없습니다.
설명
선언 내 typedef
의 명명되지 않은 클래스에는 다음 이외의 멤버가 있을 수 없습니다.
- 기본 멤버 이니셜라이저가 없는 비정적 데이터 멤버,
- 멤버 클래스 또는
- 멤버 열거형
중첩된 각 클래스에 동일한 제한이 재귀적으로 적용됩니다. 제한 사항은 연결을 위해 typedef
이름이 있는 구조체의 단순성을 보장하기 위한 것입니다. 컴파일러가 연결을 위해 typedef
이름에 도달하기 전에 연결 계산이 필요하지 않을 만큼 간단해야 합니다.
이 경고는 Visual Studio 2019 버전 16.6의 새로운 기능입니다. C++ 표준 위원회에서 결함 보고서로 채택한 P1766R1 따라 컴파일러의 모든 표준 모드에 영향을 줍니다. 기본 /std:c++14
및 /std:c++17
모드에서 컴파일러는 비준수 코드에 대한 경고 C5208을 내보낸다. 지정된 경우 /permissive-
컴파일러는 경고 C5208을 오류로 내보낸다 /std:c++14
. 컴파일러는 이상 지정된 경우 /std:c++17
비준수 코드에 대한 오류 C7626을 내보낸다.
코드를 변경하지 않고 경고를 끄려면
pragma#pragma warning(suppress : 5208)
를 사용하여 warning
특정 코드 줄에 대한 경고를 끌 수 있습니다. 경고 pragma #pragma warning(disable : 5208)
를 사용하여 파일 내에서 경고를 끌 수도 있습니다. /wd5208 명령줄 옵션을 사용하여 명령줄 빌드에서 전역적으로 경고를 끌 수 있습니다.
Visual Studio IDE에서 전체 프로젝트에 대한 경고를 해제하려면 다음을 수행합니다.
- 프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조 하세요.
- 구성 속성>C/C++>고급 페이지를 선택합니다.
- 특정 경고 사용 안 함 속성을 편집하여 추가
5208
합니다. 확인을 선택하여 변경 내용을 적용합니다.
예시
다음 샘플은 명명되지 않은 구조체에서 더 이상 허용되지 않는 구문을 보여 줍니다. 지정된 표준 모드에 따라 C5208 또는 C7626 오류나 경고를 내보냅니다.
struct Base { };
typedef struct : Base // inheriting from 'Base'; ill-formed
{
void fn(); // ill-formed
static int i; // ill-formed
struct U {
void f(); // nested class has non-data member; ill-formed
};
int j = 10; // default member initializer; ill-formed
} S;
위의 코드는 명명되지 않은 클래스에 이름을 지정하여 수정할 수 있습니다.
struct Base { };
typedef struct NamedType : Base
{
void fn();
static int i;
struct U {
void f();
};
int j = 10;
} S;