Цитата(Сергей Борщ @ Jan 26 2007, 23:14)

Код
device1_cmd cmd1;
cmd1 = CMD5; // проходит, ибо "родное"
cmd1 = CMD9; // не проходит, и правильно
cmd1 = CMD1; // не проходит, а я хочу чтоб проходило.
Вопрос - как сделать так, чтобы значение типа command_t неявно(!) при необходимости преобразовывалось к device1_cmd.
А как вам понравится такое "проходит"
Код
#include <iostream>
using std::cout;
using std::endl;
enum command_t { CMD1, CMD2, CMD3 = 3 };
enum device1_cmd { CMD4 = CMD3, CMD5 = 8, CMD6 = 12 };
enum device2_cmd { CMD7 = CMD3, CMD8, CMD9 };
int main( int argc, char* argv[] ) {
device1_cmd cmd1;
cmd1 = CMD5; // проходит, ибо "родное"
cmd1 = device1_cmd( CMD4 | CMD5 );
cout << cmd1 << endl;
exit( EXIT_SUCCESS );
};
и чтоб не быть голословным - вот вам прогон (gcc 3.3.5 - QNX 6.3.2):
Код
/root/enum # enum
11
Вы хотите использовать enum совсем не в том качестве, для которого они предназначены: enum фактически не вводит нового класса, а всего лишь определяет синоним, но за счёт именной (а не структурной) типизации С++, между ними запрещены преобразования (но не запрещено присвоить "хрен знает что", что и делается в примере выше). Именно из-за этого вы не можете (и не сможете) переопределить операцию "=" - эта операция должна определяться как
член класса (внутри класса) - а класса то нет?
P.S. специально не отвечал вчера - засомневался

, решил перепровериться у Страуструпа - у него утверждается в точности то же самое.
Тем более, нереалистично желание переложить контроль допустимости значений на компилятор (как я понял, вы хотели бы чтоб это были проверки времени компиляции а не времени исолнения): значение, которое вы захотите присваивать может динамически измениться на выполнении (как в примере) - кто тогда будет проверять его допустимость?
Цитата(Сергей Борщ @ Jan 26 2007, 23:14)

С классами понятно - добавил конструктор и все. А как с enum?
Вот и определите то что вы хотите внутри класса (вложив внутрь класса) ... определите для него "=" ... но и тут будут проблемы - ну и что вы будуте делать когда выясниться что присваивается недопустимое значение?
P.S. предполагаю (чутьё подсказывает

) - что то что вы хотите вы могли бы определить используя template ... в стиле a'la Александреску

...
Попробуйте.