首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >智能指针制造器

智能指针制造器
EN

Stack Overflow用户
提问于 2016-07-21 21:23:32
回答 2查看 96关注 0票数 0

我正在研究完美转发的经典例子:智能指针生成器。

代码语言:javascript
运行
复制
template<typename T>
   //Return a smart pointer on the given objet
   shared_ptr<T> smartPointerMaker(T&& arg)
   {
       return shared_ptr<T>(forward<T>(arg));
   }

//In the main...
shared_ptr<int> p = smartPointerMaker(42);

但是它没有编译,说“没有匹配的函数来调用'std::shared_ptr::shared_ptr(int)'”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-22 03:30:04

您应该使用std::make_shared(),如果它在您的编译器中可用(它应该是这样的):

代码语言:javascript
运行
复制
shared_ptr<int> p = make_shared<int>(42);

您的手动实现不起作用,因为您没有将输入参数传递给Tnew形式的实例以供shared_ptr保留。您正尝试将该参数直接传递给shared_ptr构造函数,这不是shared_ptr的工作方式,也是代码无法编译的原因。

您需要将参数转发给T构造函数,并将Tnewed实例指针传递给shared_ptr构造函数,例如:

代码语言:javascript
运行
复制
template<class T, class U>
shared_ptr<T> smartPointerMaker(U&& arg)
{
    return shared_ptr<T>(new T(forward<U>(arg)));
}

或者:

代码语言:javascript
运行
复制
template<class T, class... U>
shared_ptr<T> smartPointerMaker(U&&... args)
{
    return shared_ptr<T>(new T(forward<U>(args)...));
}

然后你可以这样做:

代码语言:javascript
运行
复制
shared_ptr<int> p = smartPointerMaker<int>(42);
票数 0
EN

Stack Overflow用户

发布于 2016-07-22 03:27:21

如果您正确地编写了完美的转发函数,以便它转发它的参数,那么

代码语言:javascript
运行
复制
shared_ptr<int> p = smartPointerMaker(42);

等同于:

代码语言:javascript
运行
复制
shared_ptr<int> p = shared_ptr<int>(42);

这并不奇怪,这不能编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38505498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档