Ошибка 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
, он по-прежнему выдает ошибку. Как я могу заставить этот код работать как мое намерение?