前向声明问题:嵌套名称说明符中使用的类型不完整'enums::Category'

Trouble with forward declaration: incomplete type 'enums::Category' used in nested name specifier

本文关键字:类型 Category enums 嵌套 问题 声明 说明符      更新时间:2023-10-16

我想在enum周围有一个包装器,这将使我有机会将其转换为字符串,反之亦然。

基类如下:

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是在你的类中声明的,所以当你指定Category继承StringConvertedEnum时,它在声明之前不存在。这是一个不完整的类型,参见标准"3.3.2声明点[basic.scope]"的相关部分。(感谢andy在评论中指出这一点)。

解决这个问题最简单的方法是在Category之外声明Enum:

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

这遵循Python的Zen,即使我们谈论的是c++:

平的比嵌套的好。

第二种最简单的方法是声明基类:
class BaseCategory {
public:
    enum Enum {
        Category1,
        Category2,
        OTHER
    };
};
class Category : public BaseCategory, public StringConvertedEnum<BaseCategory::Enum> {};

正如在注释中指出的那样,如果您正在使用现代c++,则应该考虑有作用域的枚举。