我正在尝试使用派生类中定义的类型从模板类继承。 我试过这个,但它不起作用。
class A : std::vector<A::B>
{
enum B { foo, bar };
};
这样做有一种优雅的方法吗?
编辑:我知道如果先前定义了B,它会起作用。但我正在寻找一种解决方案,允许将类型B封装在A类中。
答案 0 :(得分:3)
您无法在C ++ 03中转发声明枚举。只需使用矢量作为成员并手动转发即可使用正常组合。
答案 1 :(得分:2)
在继承之前,您必须定义enum B
。
此外,您不是继承标准vector
,是吗?
答案 2 :(得分:1)
在我看来,最好的(公认是间接的)解决方案是使用组合而不是继承:
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.
};
答案 3 :(得分:0)
感谢大家的回答,但我刚发现(编辑:错误)解决方案:
namespace
{
enum B_type { foo, bar };
}
class A : std::vector<B_type>
{
typedef value_type B;
};