Проблема с typedef в том, что он не заставляет A уходить. Вы не сможете сказать F f = B::ONE;
, потому что B :: ONE не существует. Вам все равно придется использовать A :: ONE и т. Д. Насколько я понимаю, это не то, что вам нужно.
Для того, на что вы, похоже, рассчитываете, создание нового перечисления в B, вероятно, будет лучшим выбором. Единственное, о чем следует помнить: 1) вам нужно будет ввести приведение между A :: E и B :: F и 2) изменения в одном перечислении должны быть отражены в другом.
Хотя нет необходимости копировать значения так, как вы это делаете. Если A :: E было:
enum E { ONE = 4, TWO = 7, THREE, FOUR, FIVE };
Вы можете скопировать и вставить это, чтобы создать B :: F:
enum F { ONE = 4, TWO = 7, THREE, FOUR, FIVE };
Однако недостатком этого метода копирования и вставки является то, что если я тогда решу изменить A :: TWO на десять, я должен быть уверен, что изменил B :: TWO. Если бы вы определили B :: F так, как вы показали (ONE = A :: ONE ...), это не было бы проблемой, но это было бы немного больше работы.