Когда у класса есть конструктор по умолчанию, я могу использовать экземпляр 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>);
^
Почему это так и как я могу скомпилировать свой код?