Перенос значений enum в другое namespace
От: kvser  
Дата: 13.08.08 04:40
Оценка:
Здравствуйте!


struct Bibl
{
    enum BiblEnum {BIBLVAL1, BIBLVAL2, BIBLVAL3};
};


struct Contr
{
    typedef Bibl::BiblEnum BiblEnum;

    void f(BiblEnum& val){}
};

struct Moo
{
    Contr c;
    c.f(Contr::BiblEnum::BIBLVAL1); //здесь хочу использовать BIBLVAL1 из Contr
};


Как можно такое сделать?
typedef enum
Re: Перенос значений enum в другое namespace
От: Bell Россия  
Дата: 13.08.08 04:59
Оценка: 1 (1)
Здравствуйте, kvser, Вы писали:

K>Здравствуйте!



K>
K>struct Bibl
K>{
K>    enum BiblEnum {BIBLVAL1, BIBLVAL2, BIBLVAL3};
K>};


K>struct Contr
K>{
K>    typedef Bibl::BiblEnum BiblEnum;

K>    void f(BiblEnum& val){}
K>};

K>struct Moo
K>{
K>    Contr c;
K>    c.f(Contr::BiblEnum::BIBLVAL1); //здесь хочу использовать BIBLVAL1 из Contr
K>};
K>


K>Как можно такое сделать?


Во-первых, BiblEnum не вводит пространства имен:

7.2/10
The enum-name and each enumerator declared by an enum-specifier is declared in the scope that immediately
contains the enum-specifier.


т.е. к константе BIBLVAL1 вообще нельзя обращаться так:
BiblEnum::BIBLVAL1

а только так:
Bibl:BIBLVAL1

Соответственно перенести можно только объявив такой же enum в другом namespace scope.

А зачем вообще нужно переносить? Чем не подходит такой вариант:

struct Bibl
{
    enum BiblEnum {BIBLVAL1, BIBLVAL2, BIBLVAL3};
};


struct Contr
{
    typedef Bibl::BiblEnum BiblEnum;

    void f(BiblEnum val){}
};

void test()
{
    Contr c;
    c.f(Bibl::BiblEnum::BIBLVAL1); //здесь хочу использовать BIBLVAL1 из Contr
}



Может быть вообще вынести BiblEnum за пределы Bibl?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Перенос значений enum в другое namespace
От: kvser  
Дата: 13.08.08 05:23
Оценка:
Здравствуйте, Bell, Вы писали:

т.е. к константе BIBLVAL1 вообще нельзя обращаться так:

BiblEnum::BIBLVAL1

а только так:

Bibl:BIBLVAL1


точно! точно! окарал!

B>
B>struct Bibl
B>{
B>    enum BiblEnum {BIBLVAL1, BIBLVAL2, BIBLVAL3};
B>};


B>struct Contr
B>{
B>    typedef Bibl::BiblEnum BiblEnum;

B>    void f(BiblEnum val){}
B>};

B>void test()
B>{
B>    Contr c;
B>    c.f(Bibl::BiblEnum::BIBLVAL1); //здесь хочу использовать BIBLVAL1 из Contr
B>}
B>


B>Может быть вообще вынести BiblEnum за пределы Bibl?


Bibl — библиотечный класс, а test() в случае выше — клиентская функция, которая использует Contr, причем необходимо только использовать значения enum из Bibl и еще один тип. Я вот и решил эти штуки typedef'нуть в Contr, чтобы те кто пишет test() не лазили в документацию по библиотеке Bibl. Это может быть и не нужно вовсе, но мне стало интересно как же-таки это сделать
Re[3]: Перенос значений enum в другое namespace
От: Bell Россия  
Дата: 13.08.08 05:30
Оценка:
Здравствуйте, kvser, Вы писали:

K>Bibl — библиотечный класс, а test() в случае выше — клиентская функция, которая использует Contr, причем необходимо только использовать значения enum из Bibl и еще один тип. Я вот и решил эти штуки typedef'нуть в Contr, чтобы те кто пишет test() не лазили в документацию по библиотеке Bibl.


ИМХО не стОит вводить пользователя в заблуждение. Если нужна некая сущность из библиотеки — не нужно прятать ее за своим забором
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.