Предоставленные решения ответили на мой первоначальный вопрос, но, к сожалению, не решили мои проблемы. В то время я не понимал, что API на самом деле использует преимущества внутренних перечислений.
enum Inner {
FIELD1,
FIELD2
};
class Base {
public:
virtual void use(Inner val) = 0;
};
class Outer : public Base {
public:
virtual void use(Inner val) override;
};
/*
* Some API that can't change
*/
void someAPI(Outer &inst) {
inst.use(Outer::FIELD1);
}
Другими словами, API, который мне нужно поддерживать, был не Outer::Inner::FIELD1
, а Outer::FIELD1
.
Как отметил @Brian, использование typedef для «подъема» внутреннего перечисления во внешнее не могло работать в текущем C ++.
В конце концов, я обнаружил, что могу поместить Inner в Base, а API может поддерживаться:
class Base {
public:
enum Inner {
FIELD1,
FIELD2
};
virtual void use(Inner val) = 0;
};
class Outer : public Base {
public:
virtual void use(Inner val) override;
};
/*
* Some API that can't change
*/
void someAPI(Outer &inst) {
inst.use(Outer::FIELD1);
}