将lambda作为参数传递时,参数推导失败
Argument deduction fail while passing lambda as parameter
我有我的函数;
template < typename T >
inline
vector<T> listIntersection ( vector<T>& v1, vector<T>& v2, function<bool(T, T)> comprarer )
当我调用这个函数时,比如:
v_intersection = listIntersection( v1, v2, []( A left, A right )
{
return left.getNumber() < right.getNumber();
});
参数推导失败。但是,如果我使用<A>
,如下所示;
v_intersection = listIntersection<A>( v1, v2, []( A left, A right )
{
return left.getNumber() < right.getNumber();
});
程序编译。为什么模板参数推导在第一种情况下失败?
以下是不必要但完整的示例;
struct A
{
int a;
A ( int in )
{
a = in;
}
int getNumber( )
{
return a ;
};
};
template < typename T >
inline
vector<T> listIntersection ( vector<T>& v1, vector<T>& v2, function<bool(T, T)> comprarer )
{
std::sort(v1.begin(), v1.end(), comprarer);
std::sort(v2.begin(), v2.end(), comprarer);
vector<T> v_intersection;
std::set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(v_intersection), comprarer);
return v_intersection;
}
int main()
{
std::vector<A> v1{1,2,3,4,5,6,7,8};
std::vector<A> v2{ 11, 13, 5, 7, 9,10};
std::vector<A> v_intersection;
v_intersection = listIntersection<A>( v1, v2, []( A left, A right )
{
return left.getNumber() < right.getNumber();
});
for(auto n : v_intersection)
std::cout << n.getNumber() << ' ';
}
std::function
,它有一些未命名的类型。编译器无法在一个步骤中对具有未知模板参数的std::function
进行隐式转换。
如果不想显式传递模板参数,可以将函数参数设置为模板参数类型,而不是提交给std::function
:
template < typename T, typename Fn >
inline
vector<T> listIntersection ( vector<T>& v1, vector<T>& v2, Fn comprarer )
{
//...
}
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 为什么模板参数推导失败?
- 嵌套参数包扩展失败
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 在 g++ 6.2.1 中将参数包转发到 constructor() 失败
- 当变量和参数名称匹配时,移动语义构造失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- C++模板参数失败,不是从错误派生的
- CreateThread参数失败
- 在CreateProcess中传递命令行参数失败