Boost::make_shared()与模板化类

boost::make_shared() with templated class?

本文关键字:make shared Boost      更新时间:2023-10-16

我已经看到关于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修复了提到的错字,谢谢。

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在类声明之外可能会更好(参见Python的Zen:"扁平优于嵌套"):

class GenericManager
{
public:
//... more members etc
};
typedef boost::shared_ptr<GeneriClass> GenericClassPtr;

这允许直接调用GenericClassPtr,而不是GenericManager::GenericClassPtr