首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能使用std::make_shared的实例化作为函数的指针?

为什么我不能使用std::make_shared的实例化作为函数的指针?
EN

Stack Overflow用户
提问于 2014-02-10 10:47:18
回答 1查看 2.1K关注 0票数 10

当类具有默认构造函数时,我可以使用std::make_shared的实例化方式,就像函数的指针一样。这可能是因为实例化的模板必须编译并存储在内存中,并且它的地址必须存在。

代码语言:javascript
运行
复制
#include <memory>
#include <functional>

class DefaultConstructible
{
};

typedef std::function<std::shared_ptr<DefaultConstructible>()> Generator;

int main()
{
    Generator generator(std::make_shared<DefaultConstructible>);
    std::shared_ptr<DefaultConstructible> defConst = generator();

    return 0;
}

但是,当我添加一个非平凡的构造函数时,同样的事情失败了:

代码语言:javascript
运行
复制
#include <memory>
#include <functional>

class FromInt
{
public:
    FromInt(int a):a_(a){}
    int a_;
};

typedef std::function<std::shared_ptr<FromInt>(int)> Generator;

int main()
{
    Generator generator(std::make_shared<FromInt>);
    std::shared_ptr<FromInt> p = generator(2);

    return 0;
}

我得到一个编译器错误:

代码语言:javascript
运行
复制
 error: no matching function for call to 
'std::function<std::shared_ptr<FromInt>(int)>::function(<unresolved overloaded function type>)'
     Generator g(std::make_shared<FromInt>);
                                          ^

为什么是这样,我如何使我的代码编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-10 11:02:30

您只需要明确说明您希望它使用的构造函数:

代码语言:javascript
运行
复制
Generator generator(std::make_shared<FromInt, int>);

“额外”模板参数对应于构造函数参数。

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

https://stackoverflow.com/questions/21675068

复制
相关文章

相似问题

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