2016-11-18 1 views
4

열거 형 주위에 래퍼가 있어야 문자열로 변환 할 수 있고 그 반대도 가능합니다.전달 선언에 문제가 있습니다. 중첩 된 이름 지정자에 사용되는 'enums :: Category'형식이 불완전합니다.

기본 클래스는 다음

template<typename TEnum> 
class StringConvertedEnum { 
public: 
    static std::string toString(TEnum e); 

    static TEnum toEnum(std::string &str); 

protected: 
    static const std::map<std::string, TEnum> _stringMapping; 
    static const std::map<TEnum, std::string> _enumMapping; 
}; 

을 그리고 나는이 같은 것을 갖고 싶어 :

incomplete type 'enums::Category' used in nested name specifier 
:
class Category : public StringConvertedEnum<Category::Enum> { 
public: 
    enum Enum { 
      Category1, 
      Category2, 
      OTHER 
    }; 
}; 

그러나 현재의 순간에 그것은이 오류를 통해 컴파일 아니에요을

이 문제를 해결하는 방법?

+0

[내부 클래스를 선언하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/1021793/how-do-i-forward-declare-an-inner-class) – YSC

+0

@YSC : 나는 그것이 적절한 읽기라고 생각하지만 정확하게 중복 된 것은 아닙니다. – AndyG

답변

4

Enum이 클래스 내에 선언되었으므로 CategoryStringConvertedEnum을 상속 받도록 지정하면 선언 전에 존재하지 않습니다. 이는 불완전한 유형이며, 표준 "3.3.2 Point of declaration [basic.scope.pdecl]"의 관련 부분을 참조하십시오 (주석에서 이것을 지적 해 주신 AndyG에게 감사드립니다). 우리는 C++에 대해 말하기 경우에도,이 Zen of Python을 다음과

enum Enum { 
    Category1, 
    Category2, 
    OTHER 
}; 

class Category : public StringConvertedEnum<Enum> {}; 

:

문제를 해결하는 가장 쉬운 방법은 EnumCategory 외부에 선언하는 것입니다

Flat is better than nested.

두 번째 가장 쉬운 방법은 기본 클래스를 선언하려면 :

class BaseCategory { 
public: 
    enum Enum { 
     Category1, 
     Category2, 
     OTHER 
    }; 
}; 
class Category : public BaseCategory, public StringConvertedEnum<BaseCategory::Enum> {}; 

또한 주석에 지적한 바와 같이 현대 C++를 사용한다면 scoped enums을 고려해야합니다.

+0

+1. 열거 형은 불완전한 유형이었다. 관련 표준 : "3.3.2 선언 지점 [basic.scope.pdecl]"또한 OP는 범위가 지정된 enum을 사용해야합니다. C++을 사용하고 있음 11 – AndyG

+0

@AndyG Thx가 대답을 – wasthishelpful

+0

에 추가했습니다. 범위가 지정된 열거 형이이 문제를 해결하는 데 어떻게 도움이 될지 확신 할 수 없습니다. 당신의 대답에 그것을 명확하게한다면 좋을 것입니다. –

관련 문제