从模板前向声明派生类
forward declare derived class from template c++
我在设计实现中遇到了一些问题。它是这样的:
我有一个模板基类,它有一个转换方法
// 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>&);
}
相关文章:
- 具有多个类、派生类的C++正向声明
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 将派生类的构造函数声明为父类的友元
- 从模板基类派生是否在派生类声明的点实例化模板
- 从基类的唯一指针中声明派生类的类型
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 如何声明从 QApplication 派生的 Qt 类并覆盖通知函数?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 冲突的声明(外部基础与派生)
- 声明派生类的对象而不指定它
- 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明
- 声明嵌套基模板类实例是派生类的好友
- 是否可以在C++中声明基类,以便只能通过创建函数创建从它派生的类
- 在基类中使用派生类,而在基类之后声明派生类
- 显式声明派生类中所需的析构函数
- 在IF中声明派生类以供外部使用
- C++在if-else内部声明派生类对象,并在外部使用它
- 从模板前向声明派生类