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

时间:2014-02-10 10:47:19

标签: c++ templates c++11 c++-standard-library

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

#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;
}

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

#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;
}

我收到编译错误:

 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>);
                                          ^

为什么会这样,我怎样才能编译代码?

1 个答案:

答案 0 :(得分:9)

您只需明确要使用哪个构造函数:

Generator generator(std::make_shared<FromInt, int>);

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