Функтор в шаблонную функцию - PullRequest
4 голосов
/ 29 марта 2012

Я хочу сделать функтор для универсальной функции, но получаю ошибку компилятора.Вот код:

template <class T>
struct Creator
{
    template <typename...Ts>
    static std::shared_ptr<T> create(Ts&&... vs)
    {
        std::shared_ptr<T> t(new T(std::forward<Ts>(vs)...));
        return t;
    }
};

class Car:
        public Creator<Car>
{
    private:
        friend class Creator<Car>;
        Car()
        {
        }
};

int main()
{
    auto car=Car::create();
    std::function< std::shared_ptr<Car> () > createFn=&Car::create;

    return 0;
}

Я получаю следующую ошибку в GCC 4.6.3 для второго оператора (первый в порядке):

error: conversion from ‘<unresolved overloaded function type>’
       to non-scalar type ‘std::function<std::shared_ptr<Car>()>’ requested

Любая подсказка приветствуется.*

1 Ответ

4 голосов
/ 29 марта 2012

Если нужен указатель на функцию шаблона, сначала необходимо создать экземпляр шаблона.

std::function<std::shared_ptr<Car>()> createFn = &Car::create<>;

Это сделает его компиляцией на clang ++ 3.1, но g ++ 4.8 все равно отказывается компилироваться, что, я считаю,ошибка.

Вы можете предоставить лямбда-функцию вместо:

std::function<std::shared_ptr<Car>()> createFn = []{ return Car::create(); };
...