【问题标题】:boost::make_shared() with templated class?boost::make_shared() 与模板类?
【发布时间】:2016-10-05 07:50:50
【问题描述】:

我已经看到有很多关于使用 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 修正了提到的错字,谢谢。

【问题讨论】:

  • return boost::make_shared&lt;SpecificClass&lt;YourType&gt; &gt;(); ?

标签: c++ templates boost


【解决方案1】:

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 可能在类声明之外更好(请参阅Zen of Python:“平面优于嵌套”):

class GenericManager
{
public:
//... more members etc
};

typedef boost::shared_ptr<GeneriClass> GenericClassPtr;

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

【讨论】:

  • 它就像一个魅力,所以谢谢,但是我如何创建 GenericClassPtr SpecificClassFactory::construct() 的 MyType 模板版本,因为 GenericClass 没有模板化?我可以调用 return boost::make_shared > 但不能调用 boost::make_shared。我在这里想念什么?我可以创建一个具有两个单独的 float/double 变体的宏,但这就是我要避免的!
  • @user3616082 不确定是否理解您的评论。我编辑了我的答案,告诉我它是否有帮助(或没有^^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多