从模板前向声明派生类

forward declare derived class from template c++

本文关键字:声明 派生      更新时间:2023-10-16

我在设计实现中遇到了一些问题。它是这样的:

我有一个模板基类,它有一个转换方法

// Foo.h
class Bar;
template<typename T>
class Foo {
    virtual const Bar toBar();
}

我想要一个派生类Bar从Foo的特定形式继承,例如:

// Bar.h
class Bar : public Foo<float> {
    // Insert Bar methods here, Etc.
}

由于Foo是一个模板,实现必须在头文件中完全定义,这导致toBar()方法的实现需要能够创建Bar类型的实例的问题。因此,这告诉我,我需要在Foo定义之后,但在Foo实现之前包含Bar.h头文件。

但是,在Bar.h中,类Bar是从Foo派生的,因此必须提供Foo的完整定义。这会导致问题,因为这两个文件有一个循环依赖,不能通过前向声明来解决,因为前向声明是一个派生类。

如果另一个类SomeClass有一个Bar类型的数据成员,包括Bar.h,其中包含Foo.h(因为它是模板),这就更复杂了。包括Bar.h。

哦,为了清楚起见所有的头文件都有包含保护符

#ifndef _HEADER_NAME_H_
#define _HEADER_NAME_H_
...
#endif

其他人是如何解决这样复杂的问题的?

作为一个更具体的例子,假设我有一个Array类,它有一个方法将其转换为人类可读的String类,如toString()…然而,String类被声明为

class String : public Array<char> {...};

提前感谢。加里。

为了使Foo< float >成为基类,它必须由Bar定义点完全定义。然而,Foo不一定需要知道Bar,如果你可以使Bar成为Foo的依赖类型名。

在定义Foo之前前向声明Bar可能就足够了。如果你张贴/链接更多具体的代码,我可能能给你一个更好的答案。

试试这个:

class Bar;
template< typename T, typename DependantBar = Bar >
class Foo {
    virtual const DependantBar toBar();
}

class Bar : public Foo<float> {
    template <typename T>
    Bar create(const Foo<T>&);
}