Mar*_*dik 10 c++ templates c++-standard-library c++11
当一个类有一个默认的构造函数时,我可以使用与指向函数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>);
                                          ^
为什么会这样,我怎样才能编译代码?
您只需要明确您希望它使用哪个构造函数:
Generator generator(std::make_shared<FromInt, int>);
"extra"模板参数对应于构造函数参数.