C++11 带有std::function参数的函数不接受lamba函数

C++11 带有std::function参数的函数不接受lamba函数,c++11,visual-studio-2013,lambda,std-function,C++11,Visual Studio 2013,Lambda,Std Function,通过在我自己的双链表集合上实现std::iterator,并尝试使用我自己的sort函数对其进行排序,我试图更加熟悉C++11标准 我希望sort函数通过使sort接受std::function来接受lamba作为排序方式,但它不编译(我不知道如何实现move\u迭代器,因此返回集合的副本,而不是修改传递的集合) 模板 LinkedList排序(常量LinkedList&source,std::function pred) { LinkedList tmp; while(tmp.size()!=

通过在我自己的双链表集合上实现
std::iterator
,并尝试使用我自己的
sort
函数对其进行排序,我试图更加熟悉C++11标准

我希望
sort
函数通过使
sort
接受
std::function
来接受lamba作为排序方式,但它不编译(我不知道如何实现
move\u迭代器,因此返回集合的副本,而不是修改传递的集合)

模板
LinkedList排序(常量LinkedList&source,std::function pred)
{
LinkedList tmp;
while(tmp.size()!=source.size())
{
_适合的;
用于(自动和输入:源){
if(pred(合适,i)=真){
合适=i;
}
}
tmp.推回(合适);
}
返回tmp;
}
我对函数的定义是否错误?如果我试图调用该函数,就会收到编译错误

LinkedList<std::string> strings{
    "one",
    "two",
    "long string",
    "the longest of them all"
};

auto sortedByLength = sort(strings, [](const std::string& a, const std::string& b){
    return a.length() < b.length();
});
LinkedList字符串{
“一个”,
“两个”,
“长串”,
“最长的”
};
auto-sortedByLength=排序(字符串,[](常量std::string&a,常量std::string&b){
返回a.length()
错误:没有函数模板“sort”的实例与参数匹配 列表参数类型为:(LinkedList,lambda[]bool (const std::string&a,const std::string&->bool)

其他信息,汇编还提供以下错误:

错误1错误C2784:“LinkedList排序(常量 LinkedList&,std::function)“”:无法 推断“
std::function
”的模板参数



更新:我知道排序算法不正确,不会做想要的事情,我不想让它保持原样,也不想在声明正确后修复它。

问题是
std::function
中使用的
\u不能从lambda闭包中推导出来。您需要传入一个实际的
std::function
对象,而不是lambda。请记住,lambda表达式的类型是未命名的类类型(称为闭包类型),而不是
std::function

你所做的有点像这样:

template <class T>
void foo(std::unique_ptr<T> p);

foo(nullptr);
这样,就可以推导出闭合类型,一切都很好

请注意,您根本不需要
std::function
,只有当您需要存储一个functor或通过运行时接口(而不是像模板一样的编译时接口)传递它时,才需要它



旁注:代码使用的标识符是为编译器和标准库保留的(标识符以下划线开头,后跟大写字母)。这在C++中是不合法的,你应该避免在代码中保留这些标识符。

谢谢Angew,这是有效的。我完全完美的C++,直到你介绍模板,这基本上意味着我不能在C++编程。谢谢你的旁注,来自PHP世界,我们实际上没有这样的东西。非常感谢。顺便说一句,命名惯例只有一个问题,对吗?不可能仅仅因为我这样命名模板参数,它们就会干扰标准库。或者模板制作有什么特殊的怪癖,可能会破坏一切?@DavidPacker,这可能是一个真正的问题。这是因为标准库允许将此类名称用于任何目的,包括宏。想象一下,您的代码将如何处理标准库标题中的某个地方的
#define _By(void)
之类的内容…@Angew关于lambda和std::函数的一个附带问题。使函数类型成为模板参数确实是标准库中的做法,但我认为lambda可以转换为具有匹配签名的std::function对象。是我错了,还是OP的lambda最初的问题与带有_By=string的std::函数参数的签名与带有const string&?@DavidPacker的lambda签名不匹配有关?标准库不仅可以使用这些名称,而且还必须使用它们。否则,它可能会遇到相反的问题:用户定义的宏会弄乱它自己的内部结构。
template <class T>
void foo(std::unique_ptr<T> p);

foo(nullptr);
template <typename _Ty, typename _Pred>
LinkedList<_Ty> sort(const LinkedList<_Ty>& source, _Pred pred)