【发布时间】:2017-04-19 07:27:42
【问题描述】:
我在 Base.h 中定义了一个基类 Base:
class Base
{ /* ... */ };
还有一个派生自Base的类模板Child,在Child.h中定义:
#include "Base.h"
template <class T>
class Child : public Base
{ /* ... */ };
现在我想在Base 类中创建一些工厂方法,它应该将std::shared_ptr 返回到Child 类。为了避免循环依赖,我尝试使用前向声明。所以 Base.h 现在看起来像这样:
class Child; // new forward declaration
class Base
{
/* ... */
// new factory method
static std::shared_ptr<Base> CreateChildInt(int i = 0)
{
return std::make_shared<Child<int>>(i);
}
};
但是,CreateChildInt() 的定义导致以下编译错误:
“错误 C2947:期望 '>' 终止模板参数列表,发现 '
那么这甚至可能是我想要实现的目标吗?
如果没有,这种方法是否有任何解决方法/最佳实践?
编辑:
我为什么要将工厂方法放入Base类而不是Child的原因如下。当我将工厂放入Child 时,我需要像这样调用工厂方法:
std::shared_ptr<Base> p = Child<int>::CreateChildInt(3);
但是,我想在此调用中省略模板类型 <int>,因此:
std::shared_ptr<Base> p = Base::CreateChildInt(3);
【问题讨论】:
-
你需要
template <typename> class Child;。 -
为什么这个工厂函数是
Base的一部分?通常,OO 基类不应该知道他们的孩子。 -
@Matthias 我不会把它放在任何一个类中。反正是
static;为什么不把它放在外面? -
天哪!我使用 Java 的时间太长了,所以我什至没有想过在类之外创建一个普通函数的想法。就是这样,谢谢!
标签: c++ c++11 templates shared-ptr