前向声明问题:嵌套名称说明符中使用的类型 'enums::Category' 不完整
Trouble with forward declaration: incomplete type 'enums::Category' used in nested name specifier
我想要一个围绕枚举的包装器,这样我就有机会将它转换为字符串,反之亦然。
基础 class 如下:
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;
};
然后我想要这样的东西:
class Category : public StringConvertedEnum<Category::Enum> {
public:
enum Enum {
Category1,
Category2,
OTHER
};
};
但是目前它没有通过这个错误编译:
incomplete type 'enums::Category' used in nested name specifier
如何解决这个问题?
因为 Enum
是在您的 class 中声明的,所以当您指定 Category
继承 StringConvertedEnum
时,它在声明之前并不存在。这是一个不完整的类型,请参阅标准的相关部分 "3.3.2 Point of declaration [basic.scope.pdecl]"(感谢 AndyG 在评论中指出这一点)。
最简单的解决方法是在Category
外声明Enum
:
enum Enum {
Category1,
Category2,
OTHER
};
class Category : public StringConvertedEnum<Enum> {};
下面是 Zen of Python,即使我们谈论的是 C++:
Flat is better than nested.
第二种最简单的方法是声明一个基数class:
class BaseCategory {
public:
enum Enum {
Category1,
Category2,
OTHER
};
};
class Category : public BaseCategory, public StringConvertedEnum<BaseCategory::Enum> {};
正如评论中指出的那样,如果您使用的是现代 C++,则应考虑 scoped enums。
我想要一个围绕枚举的包装器,这样我就有机会将它转换为字符串,反之亦然。
基础 class 如下:
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;
};
然后我想要这样的东西:
class Category : public StringConvertedEnum<Category::Enum> {
public:
enum Enum {
Category1,
Category2,
OTHER
};
};
但是目前它没有通过这个错误编译:
incomplete type 'enums::Category' used in nested name specifier
如何解决这个问题?
因为 Enum
是在您的 class 中声明的,所以当您指定 Category
继承 StringConvertedEnum
时,它在声明之前并不存在。这是一个不完整的类型,请参阅标准的相关部分 "3.3.2 Point of declaration [basic.scope.pdecl]"(感谢 AndyG 在评论中指出这一点)。
最简单的解决方法是在Category
外声明Enum
:
enum Enum {
Category1,
Category2,
OTHER
};
class Category : public StringConvertedEnum<Enum> {};
下面是 Zen of Python,即使我们谈论的是 C++:
Flat is better than nested.
第二种最简单的方法是声明一个基数class:
class BaseCategory {
public:
enum Enum {
Category1,
Category2,
OTHER
};
};
class Category : public BaseCategory, public StringConvertedEnum<BaseCategory::Enum> {};
正如评论中指出的那样,如果您使用的是现代 C++,则应考虑 scoped enums。