c++ - 从模板类继承,类型在子类中声明

标签 c++ templates inheritance types

我想要一个模板父类(虚拟)。子类继承自父类并在其内部定义类型。

// PARENT
template <typename A, typename B>
class Parent 
{
public:
    Parent();
    virtual ~Parent();
    // ...
};

// CHILD
class Child : public Parent<SomeStruct , AnotherStruct>
{
public:
    struct SomeStruct 
    {/*...*/};

    struct AnotherStruct
    {/*...*/};

    Child();
    ~Child();
    // ...
};

显然,编译器会提示尚未定义的“SomeStruct”。问题是如何实现类似的东西。一种简单的方法是在类之外定义结构,但这会使事情变得更加丑陋。

最佳答案

这是先有鸡还是先有蛋的情况。编译器需要查看声明的结构,以便实例化 Parent。

你可以试试这样的:

template <typename A, typename B>
class Parent 
{
public:
    Parent();
    virtual ~Parent();
    // ...
};

// CHILD
class ChildBase
{
    public:
    struct SomeStruct 
    {/*...*/};

    struct AnotherStruct
    {/*...*/};
};

class Child : public ChildBase, public Parent<ChildBase::SomeStruct, ChildBase::AnotherStruct>
{
public:
    using ChildBase::SomeStruct;
    using ChildBase::AnotherStruct;

    Child();
    ~Child();
    // ...
};

这是多重继承路线。或者,您可以将结构声明放在命名空间而不是基类中,这不会让它们位于全局命名空间中。

这两种方式都不是您想要的,但如果您想要 Child::SomeStruct 类型的语法,请不要污染全局命名空间并让类型在 Child 上可见。

关于c++ - 从模板类继承,类型在子类中声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508693/

相关文章:

c++ - 删除 std::vector<std::string> 中与另一个给定 std::string 中的字符匹配的元素

c++ - 来自 vector 的值与原始值不同

c++ - 编译器能否识别模板元编程中的递归问题?

objective-c - 了解何时使用继承来允许一个类使用另一个类的实例

c++ - 创建最小共享库

c++ - 模板类 C++ - 排除某些类型

c++ - 检测给定类型是否为 C++03 中的函数类型

java - 如何创建属于接口(interface)的实例并实现它

c++ - 复合类 C++ 中的冗余代码

c++ - 不支持基本模板的概念专用模板