带有模板化类的boost :: make_shared()?

时间:2016-10-05 07:50:50

标签: c++ templates boost

我已经看到有很多关于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提到错误的拼写错误,谢谢。

1 个答案:

答案 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