C++ C+的未定义符号+;兰巴斯?

C++ C+的未定义符号+;兰巴斯?,c++,debugging,lambda,c++11,C++,Debugging,Lambda,C++11,我正在C++0x中尝试一些新东西,这时遇到了一个绊脚石: #include <list> #include <cstdio> using namespace std; template <typename T,typename F> void ForEach (list<T> l, F f) { for (typename list<T>::iterator it=l.begin();it!=l.end();++it)

我正在C++0x中尝试一些新东西,这时遇到了一个绊脚石:

#include <list>
#include <cstdio>
using namespace std;

template <typename T,typename F>
void ForEach (list<T> l, F f) {
    for (typename list<T>::iterator it=l.begin();it!=l.end();++it)
        f(*it);
}

int main() {
    int arr[] = {1,2,3,4,5,6};
    list<int> l (arr,arr+6);
    ForEach(l,[](int x){printf("%d\n",x);});
}

为什么这不起作用?

这些是链接错误。你是否错过了C++库?如果您使用的是
i386-apple-darwin9-g++-4.5.0

另外,我无法测试这一点,因为我的Mac电脑上有gcc 4.2.1(i686-apple-darwin10-gcc-4.2.1),并且得到:

cc1plus: error: unrecognized command line option "-std=c++0x"

C++0x
支持需要非常新版本的
g++
。但是你的建议,代码< > G++< /COD>而不是<代码> GCC 可能是命中注定的。如果GCC没有把它作为C++源文件来识别,它会怎样进入链接器阶段?但是,它到达链接阶段,这可能是问题所在。在使用gcc而不是使用4.5的g++编译我的c++0x代码时,我会遇到完全相同的错误。。。“操作符new(un签署long)”< /> >,您需要立即思考“我的C++标准库没有链接。它认为我正在构建C程序。”@丹尼斯:对于大多数程序,编译和链接步骤是独立的命令。为每个源文件运行编译过程,完成后,获取所有对象并链接它们。当代码> GCC < /C>完全可以告诉它在编译时通过查看后缀给C++源提供信息,在连接完成之前,该信息在编译完成后就被丢弃,因为所有编译的文件都得到相同的后缀:<代码> o < /C>。但是我认为最好是通过引用而不是通过值来接受函子。@Ben:通常你想通过值来接受它,因为如果函子是可变的,它仍然可以工作。如果您真的不想复制,那么,
std::ref
会解决这个问题@奥斯汀:
std::for_每个
都同样有效:P@GMan是的,但重点是玩新东西…:D@GMan:如果你在lambda中捕获了变量,通过值传递不会中断连接吗?@Ben:no。Lambda不是可复制分配的,但它们有一个隐式生成的复制构造函数(和移动构造函数)。它将在调用函数时进行复制构造,这也将绑定副本的引用,就像它们在原始lambda中一样。
cc1plus: error: unrecognized command line option "-std=c++0x"