C++ 如何在共享指针(C+;+;)中为模板类使用前向声明

C++ 如何在共享指针(C+;+;)中为模板类使用前向声明,c++,c++11,templates,shared-ptr,C++,C++11,Templates,Shared Ptr,我在base.h中定义了一个基类base: class Base { /* ... */ }; #include "Base.h" template <class T> class Child : public Base { /* ... */ }; 以及从Base派生的类模板Child,在Child.h中定义: class Base { /* ... */ }; #include "Base.h" template <class T> class Child

我在base.h中定义了一个基类
base

class Base
{ /* ... */ };
#include "Base.h"

template <class T>
class Child : public Base
{ /* ... */ };
以及从
Base
派生的类模板
Child
,在Child.h中定义:

class Base
{ /* ... */ };
#include "Base.h"

template <class T>
class Child : public Base
{ /* ... */ };
但是,
CreateChildInt()
的定义会导致以下编译器错误:


错误C2947:预期'>'终止模板参数列表,发现'首先,您声明了一个类,但您定义的
子类实际上是一个模板。声明类模板的正确方法是:

template <class T>
class Child;
模板
班级儿童;
但是,仅正确的转发声明对您没有帮助。
CreateChildInt::CreateChildInt
的实现必须知道
Child
的完整定义,因为它创建了一个实例。您也不能在
Base
之前定义
Child
,因为继承也依赖于完整定义,所以你最终会有一个循环依赖

解决方案:向前声明
Child
,然后定义
Base
,但不内联定义
Base::CreateChildInt
,然后定义
Child
,最后定义
Base::CreateChildInt



我发现从OOP的角度来看,基类成员函数的实现依赖于子类。我建议您考虑重新设计您的方法。

您需要<代码>模板类子;。为什么这个工厂的功能是 BASE<代码>?通常OO基类不应该知道他们的孩子。@Matthias我不会把它放在任何一个类中。不管怎样,它是
静态的
;为什么不把它放在外面呢?哦,天哪!我用Java工作太久了,所以我甚至没有想过在类之外创建一个普通函数。就是这样,谢谢!我更新了我原来的问题,以便更好地解释我想做的事情hieve,为什么我想把工厂方法放在
基类中
类中。@Matthias你有强烈的理由反对把工厂函数放在子类中,但是你有任何理由把工厂函数放在基类中而不是外面吗?你是对的,来自Java,我没有想过放的想法在类外调用函数:)
template <class T>
class Child;