На мой взгляд, лучшее (по общему признанию, косвенное) решение - использовать композицию, а не наследование:
class A
{
enum B { foo, bar };
std::vector<B> bs;
};
Если по какой-то причине вам нужно (или вы действительно хотите) использовать частное наследование для встраивания вектора в ваш объект, тогда тип нужно будет определить перед классом в области пространства имен, поскольку типы нельзя использовать до того, как они будут использованы. объявлен. Если они не предназначены для доступа пользователей класса, и вы не хотите загрязнять пространство имен, содержащее ваш класс, тогда вы можете поместить их в пространство имен, чтобы указать, что они являются деталями реализации:
namespace details
{
enum B { foo, bar };
}
class A : std::vector<details::B>
{
typedef details::B B; // if you don't want to write "details::B" everywhere
static const B foo = details::foo; // if you don't want to write "details::foo" everywhere
// and so on.
};