Ошибка 1 не является выводимым контекстом. Это простая ошибка удержания из-за несоответствия типов.

#include <vector>
#include <functional>

template<class F>
class Foo
{
public:
    template <class T>
    void std_function(std::function<F(std::vector<T>)> functor)
    {
        /* something */
    }

    template <class T>
    void func_ptr(F (*funtor)(std::vector<T>))
    {
        /* something else */
    }
};

template<class T, class F>
F bar(std::vector<T>)
{
    return F();
}

int main()
{
    Foo<double> test;
    std::function<double(std::vector<int>)> barz = bar<int, double>;

    test.std_function(bar<int, double>); //error 1
    test.std_function(barz); //OK 1
    test.func_ptr(bar<int, double>); //OK 2

    test.std_function(bar<int>); //error 2::1
    test.func_ptr(bar<int>); //error 2::2

    return 0;
}

с 1.

Линияошибка 1 : Я пытаюсь передать явно созданную функцию шаблона (bar<int, double>) какstd::function, но это не законно.

ЛинияОК 1 : Если я завернуbar<int, double> вstd::function<double(std::vector<int>)> и передать завернутый функтор, теперь это законно.

ЛинияОК 2 : Если я прохожуbar<int, double> черезFoo::func_ptr, который получает указатель на функцию в качестве аргумента вместоstd::functionЭто также законно.

Я хочу сделать линиюошибка 1 законны. Как в линииОК 2, можно пройтиbar<int, double> без какой-либо обертки (в отличие от линииОК 1) и сохранить ту же форму. Но тип параметра отличается. Я хочу пройти какstd::function, а не указатель на функцию.

Вопрос 2.

Линияошибка 2 :: 1 и 2 :: 2 : Чего я пытаюсь добиться здесь, так это того, что я хочуFoo вывести тип возвратаbar как его тип шаблона классаF(для кода выше,F являетсяdouble). Так что я могу просто пройти какbar<int>неbar<int, double>.

Но кажется, что провал дедукции, потому что даже если я прохожуbar<int> черезFoo::func_ptr, он по-прежнему выдает ошибку. Как я могу заставить этот код работать как мое намерение?

Ответы на вопрос(1)

Ваш ответ на вопрос