从模板c ++转发声明派生类

时间:2011-09-15 21:39:09

标签: c++ class templates forward derived

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

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

// 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的数据成员,这会变得更复杂,包括包含Foo.h的Bar.h(因为它是一个模板) 包括Bar.h。

哦,只是要清楚所有头文件都有使用

的包含警卫
#ifndef _HEADER_NAME_H_
#define _HEADER_NAME_H_
...
#endif

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

作为一个更具体的例子,我说我有一个Array类,它有一个方法将它转换为人类可读的String类,如toString()......但是String类声明为

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

提前致谢。 加里。

2 个答案:

答案 0 :(得分:1)

为了使Foo< float >成为基类,它必须完全由Bar定义点定义。但是,Foo并非必须了解Bar,如果您可以将Bar作为Foo中的从属类型名称。

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

试试这个:

class Bar;

template< typename T, typename DependantBar = Bar >
class Foo {

    virtual const DependantBar toBar();

}

答案 1 :(得分:0)

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