А зачем в разных пространствах имен объявлять одни и теже сущности? А потом еще и взаимосвязь им настраивать руками? Может быть лучше вынести enum Color в отдельный namespace и пусть из NM1 и NM2 используют константы из этого пространства имен..?
Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
Тут надо ещё подумать как обрабатывать случаи, когда в приёмнике нет соответствующих имён.
Можно выбрасывать исключение, устанавливать в указанное значение, или в значение источника. Это можно определять стратегиями, или написать разные функции.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, YuriyT, Вы писали:
YT>>День добрый. YT>>Подскажите, пожалуйста, YT>>есть enum в разных пространствах:
YT>>Есть ли решения получше?
R>Если хотя бы одно место можно менять, то использовать одно определение.
R>
R>namespace NS1
R>{
R> enum Color {red, green};
R>}
R>namespace NS2
R>{
R> using NS1::Color;
R>}
R>
R>
да, только одно пространство можно менять,
но компилируется только такой код
namespace NS1
{
enum Color {red, green};
}
namespace NS2
{
using NS1::Color;
using NS1::red;using NS1::green;
}
в любом случае это лучше первоначального варианта,
спасибо
Здравствуйте, Kislorod, Вы писали:
K>А зачем в разных пространствах имен объявлять одни и теже сущности? А потом еще и взаимосвязь им настраивать руками? Может быть лучше вынести enum Color в отдельный namespace и пусть из NM1 и NM2 используют константы из этого пространства имен..?
Согласен, нет смысла, но код уже написан,
и менять можно только одно пространство
Здравствуйте, Tonal-, Вы писали:
T>Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
Здравствуйте, YuriyT, Вы писали: T>>Если имеется в виду, что тебе нужно, чтобы одноимённые члены перечислений преобразовывались друг в друга, то можно немного подправить код из Копирование по маске
. YT>Да, это и имеется в виду. YT>Нельзя использовать boost, stl, исключения. YT>Должно работать в VC6
VC6 вроде только SFINAE не разумеет. Остальное несложно руками.
Но и SFINAE там нужно только для случая, когда в перечислении источнике нет какого-нибудь имени из получателя (предпологается что enum_traits для получателя).
Если наборы имён совпадают, можно обойтись.
Плюс этого решения в том, что не одно пространство имён изменять не нужно.
Но и если тебе подходит решение с using-ом — лучше взять его — гораздо проще и прозрачнее. К тому же совпадение по значениям.
Хотя, если таки хочется исеть "своё" перечисление в каждом, то можно так:
namespace NS2 {
enum Color {red=NS1::red, green=NS1::green};
};