我已经看到有很多关于boost的make_shared()和模板化课程的使用的问题/答案,但是在C ++上我是不是很新,我似乎找不到我想要的东西。 所以基本上我创建了一个名为Generic的类,它的管理器类GenericManager具有以下公共成员。
class GenericManager
{
public:
typedef boost::shared_ptr<GeneriClass> GenericClassPtr;
//... more members etc
};
现在我有另一个模板,我想创建一个make_shared调用,即:
template <class MyType>
SpecificClass<MyType>::...
{
//class members functions etc
};
然后我要做的电话是:
GenericClassPtr SpecificClassFactory::construct()
{
return boost::make_shared<SpecificClass>();
}
哪个适用于非模板化版本的SpecificClass,但对于模板化版本,我得到通常的错误:
error: no matching function for call to ‘make_shared()’
如何调用make_shared来接受模板类型?现在我试着坚持使用C ++ 98!
编辑:@wasthishelpful提到错误的拼写错误,谢谢。
答案 0 :(得分:3)
SpecificClass
需要模板参数:
return boost::make_shared<SpecificClass<SomeType> >();
// in C++98, do not forget space here ^^^
因此,对于整个班级,您的construct
方法也应该有一个:
template<typename SomeType>
struct SpecificClassFactory
{
static GenericClassPtr construct()
{
return boost::make_shared<SpecificClass<SomeType> >();
}
};
// usage
GenericManager::GenericClassPtr ptr = SpecificClassFactory<SomeType>::construct();
或仅适用于方法:
template<typename SomeType>
GenericClassPtr SpecificClassFactory::construct()
{
return boost::make_shared<SpecificClass<SomeType> >();
}
// usage
GenericManager::GenericClassPtr ptr = SpecificClassFactory::construct<SomeType>();
请注意,GenericClass
中的typedef在类声明之外可能会更好(请参阅Kibana:&#34; Flat优于嵌套&#34;):
class GenericManager
{
public:
//... more members etc
};
typedef boost::shared_ptr<GeneriClass> GenericClassPtr;
这样可以直接拨打GenericClassPtr
,而不是GenericManager::GenericClassPtr
。