使用派生类中定义的类型继承模板类

时间:2011-05-08 13:15:47

标签: c++ templates inheritance

我正在尝试使用派生类中定义的类型从模板类继承。 我试过这个,但它不起作用。

class A : std::vector<A::B>
{
    enum B { foo, bar };
};

这样做有一种优雅的方法吗?

编辑:我知道如果先前定义了B,它会起作用。但我正在寻找一种解决方案,允许将类型B封装在A类中。

4 个答案:

答案 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;
};