使用std::函数替换模板失败
Template substitution failure with std::function
我试图传递回调函数作为函数参数。但是在以下代码中出现模板替换失败错误。不确定为什么模板替换失败。
#include<iostream>
#include <map>
#include <tuple>
#include <functional>
template<typename A,typename B>
void myfun(std::map<A,B> & mm, std::function<std::tuple<A,B>(void)> fn)
{
A key;
B val;
std::tie(key,val) = fn();
mm[key] = val;
}
std::tuple<std::string,int> fun()
{
return std::make_tuple(std::string("hi"),1);
}
int main()
{
std::map<std::string,int> gg;
#if 0
//fixed version
std::function<std::tuple<std::string,int>(void)> yy = fun;//fixed
myfun(gg,yy);//fixed
#else
// error causing code
myfun(gg,fun);
#endif
}
错误如下
main.cpp:8:6: note: template argument deduction/substitution failed:
main.cpp:25:17: note: mismatched types 'std::function<std::tuple<_T1, _T2>()>' and 'std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> (*)()'
myfun(gg,fun);
编译器不能既强制转换为std::function
又推断出模板实参。它不理解任意函数指针和std::function
之间的映射。
有几种方法可以绕过这个。
您可以显式地在调用站点创建std::function
:
myfun(gg,std::function<std::tuple<std::string,int>(void)>{fun});`
您可以编写一个make_function
函数来为您推断类型。你可以在网上找到关于这个的讨论和实现,比如这里,这里和这里。
myfun(gg,make_function(fun));
您可以忽略std::function
并推断整个函数类型。这是我要采取的方法:
template<typename A,typename B, typename Fun>
void myfun(std::map<A,B> & mm, Fun fn)
{
A key;
B val;
std::tie(key,val) = fn();
mm[key] = val;
}
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 模板参数推导失败,函数参数/参数不匹配
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- C++ strcpy 函数在少数主要情况下失败
- 在构造函数中分配内存失败是如何冒泡的
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 非静态成员失败的线程调用函数
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 函数返回时,带指针的复制构造函数失败
- WriteProcessMemory 在函数内部失败
- 从 C#-DLL 调用函数的 C++ 失败
- 使用已删除的函数进行编译失败,并显示 uclibc
- MPICH 的 MPI_Comm_dup() 在复制构造函数中失败
- 代码在 msvcrt .dll函数上设置断点失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 引用构造函数时链接失败
- 断言 sv_count !=0 失败 - 函数 train_auto,SVM 类型 - EPS_SVR
- C++失败函数的 while 语句