О строго типизированных перечислениях форвардной декларации - PullRequest
2 голосов
/ 08 октября 2011

В моем пространстве имен есть набор классов, и я хочу сгруппировать предварительное объявление в файле define.hpp.

Я уже достиг этого в других проектах, вот пример:

namespace Makefile
{
    class Builder;
    class Config;
    class Options;
    class Target;
    class Tool;
}

Моя проблема в том, что, например, класс Config включает следующее строго типизированное перечисление:

namespace Makefile
{
    class Config
    {   
    public:
    enum class OperatingSystem : unsigned int 
        {   
            MacOSX = 0,
            Linux = 1,
            Windows = 2 
        };  
    };
}

Итак, я хотел бы добавить этот enum-класс в мой файл предварительного объявления и добавить следующую строку:

enum class Config::OperatingSystem : unsigned int;

Вот моя проблема , я получаю следующую ошибку при компиляции:

src/Makefile/define.hpp:6:13: error: opaque-enum-specifier must use a simple identifier

Означает ли это, что невозможно заранее объявить вложенный тип? Есть ли решение этой проблемы? Это из-за моего компилятора?

Моя конфигурация: GCC 4.6.0 в Mac OS X.7

Флаги компиляции: --std=c++0x -g3 -gdwarf-2 -W -Wall -iquote gen -iquote src

1 Ответ

5 голосов
/ 08 октября 2011

Вы просто делаете непрозрачный enum в обычном месте:

namespace Makefile
{
    class Config
    {   
    public:
    enum class OperatingSystem : unsigned int;
    };
}

И затем, где бы вы ни хотели определить константы перечисления:

namespace Makefile
{
    enum Config::OperatingSystem : unsigned int
    {   
        MacOSX = 0,
        Linux = 1,
        Windows = 2 
    };
}

Ошибка opaque-enum-specifier must use a simple identifier говорит вам, что если вам нужно сослаться на перечисление, отличное от простого идентификатора, вы делаете это неправильно.

UPDATE : Для ваших конкретных нужд вы можете просто объявить enum вне класса или же в простом классе, содержащем только непрозрачный enum, и наследовать Config от него:

namespace Makefile
{
    class ConfigDecl
    {
     public:
        enum class OperatingSystem : unsigned int;
    };
    class Config : public ConfigDecl;
}
...