递归泛型函数用作谓词,编译失败
我正在编写一个函数来比较两个列表的内容。元素的顺序并不重要,因此我在比较之前对它们进行排序。列表可以是普通类型list
,也可以是列表的列表list
。。 >
这是一个完整的精简示例:
#include <list>
template <typename T>
bool lessThanInAnyOrder(T lhs, T rhs)
{
return lhs < rhs;
}
template <typename T>
bool lessThanInAnyOrder(std::list<T> lhs, std::list<T> rhs)
{
lhs.sort(lessThanInAnyOrder<T>);
rhs.sort(lessThanInAnyOrder<T>);
//Do comparisons here, but for now just:
return false;
}
int main()
{
std::list<int> list1;
std::list<int> list2;
lessThanInAnyOrder(list1, list2);
}
它在 GCC 4.3.3 中编译,但在 Visual Studio 2008 中,在我调用 lhs.sort()
时出现以下编译错误:
error C2660: 'std::list<_Ty>::sort' : function does not take 1 arguments
有什么建议吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先:我想如果您想比较集合而不管它们的顺序如何,您可能会寻找
std::set
与set_difference
、set_intersection
、set_union
和set_symmetry_difference
算法针对你的问题
你正在尝试实现按策略排序;如果您不能简单地专门化
std::less<>
(正是为了这个目的而存在),您可以自己取消自定义策略:(在 codepad.org 上运行的代码)First off: I suppose if you want to compare collections regardless of their ordering, you might be looking for
std::set
with theset_difference
,set_intersection
,set_union
andset_symmetric_difference
algorithmsTo your question
You're trying to implement sort-by-policy; if you cannot simply specialize
std::less<>
(which exists for that exact purpose), you could knock off a custom policy yourself: (code running on codepad.org)编译失败,因为编译器无法选择重载的“lessThanInAnyOrder”函数传递给 list::sort。您必须像此处那样显式指定其类型。
Compilation fails because compiler can't select overloaded 'lessThanInAnyOrder' function to pass to list::sort. You'll have to specify it's type explicitly like here.
使用显式类型参数将函数包装在
std::ptr_fun
中:Wrap the function in
std::ptr_fun
with explicit type arguments:我的猜测,对于
int
类型,你可以简单地这样写:Demo.
My guess, for
int
type you can simply write like this:Demo.