Здравствуйте!
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
};
Как можно такое сделать?
Здравствуйте, 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?
Здравствуйте, 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. Это может быть и не нужно вовсе, но мне стало интересно как же-таки это сделать
Здравствуйте, kvser, Вы писали:
K>Bibl — библиотечный класс, а test() в случае выше — клиентская функция, которая использует Contr, причем необходимо только использовать значения enum из Bibl и еще один тип. Я вот и решил эти штуки typedef'нуть в Contr, чтобы те кто пишет test() не лазили в документацию по библиотеке Bibl.
ИМХО не стОит вводить пользователя в заблуждение. Если нужна некая сущность из библиотеки — не нужно прятать ее за своим забором