Почему я не могу использовать экземпляр std::make_shared в качестве указателя на функцию?

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

Почему это так и как я могу скомпилировать свой код?


person Martin Drozdik    schedule 10.02.2014    source источник


Ответы (1)


Вам просто нужно явно указать, какой конструктор вы хотите использовать:

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

«Дополнительные» аргументы шаблона соответствуют аргументам конструктора.

person John Zwinck    schedule 10.02.2014