Возможно ли вступление в класс enum?
Я знаю, что в С++ 11 можно переслать объявление типа перечисления (если предоставляется тип хранилища), например.
enum E : short;
void foo(E e);
....
enum E : short
{
VALUE_1,
VALUE_2,
....
}
Но я хотел бы переслать объявление перечисления, определенного в классе, например.
enum Foo::E : short;
void foo(E e);
....
class Foo
{
enum E : short
{
VALUE_1,
VALUE_2,
....
}
}
Возможно ли подобное в С++ 11?
Ответы
Ответ 1
Нет, такое форвардное объявление невозможно. [decl.enum]/5 (смелый акцент мой):
Если за последним ключом перечисляется спецификатор вложенных имен, enum-specifier должен ссылаться на перечисление, которое было ранее объявляется непосредственно в классе или пространстве имен, к которому Вложенное имя-спецификатор ссылается (т.е. ни наследуется, ни вводится с помощью объявления-объявления), а спецификатор перечисления должен появиться в пространство имен, содержащее предыдущее объявление.
(В этом случае спецификатор вложенных имен будет именем вашего класса, за которым следует ::
.)
Вы могли бы, однако, поместить перечисление на улицу и использовать декларацию непрозрачного enum.
Ответ 2
Как говорит @Columbo, вы не можете объявить его в указанной вами форме.
Вы можете, однако, переслать объявление вложенного перечисления внутри объявления класса:
class Foo
{
enum E : short;
};
void foo(Foo::E e);
enum Foo::E : short
{
VALUE_1,
VALUE_2,
....
};
Получаете ли вы какую-либо выгоду, делая это, конечно, зависит от обстоятельств.