【发布时间】:2010-04-19 03:53:14
【问题描述】:
当我遇到一个绊脚石时,我只是在探索 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);});
}
不编译。我收到大量未定义的符号错误。这是make 的输出:
i386-apple-darwin9-gcc-4.5.0 -std=c++0x -I/usr/local/include -o func main.cpp
Undefined symbols:
"___cxa_rethrow", referenced from:
std::_List_node<int>* std::list<int, std::allocator<int> >::_M_create_node<int const&>(int const&&&) in ccPxxPwU.o
"operator new(unsigned long)", referenced from:
__gnu_cxx::new_allocator<std::_List_node<int> >::allocate(unsigned long, void const*) in ccPxxPwU.o
"___gxx_personality_v0", referenced from:
___gxx_personality_v0$non_lazy_ptr in ccPxxPwU.o
"___cxa_begin_catch", referenced from:
std::_List_node<int>* std::list<int, std::allocator<int> >::_M_create_node<int const&>(int const&&&) in ccPxxPwU.o
"operator delete(void*)", referenced from:
__gnu_cxx::new_allocator<std::_List_node<int> >::deallocate(std::_List_node<int>*, unsigned long) in ccPxxPwU.o
"___cxa_end_catch", referenced from:
std::_List_node<int>* std::list<int, std::allocator<int> >::_M_create_node<int const&>(int const&&&) in ccPxxPwU.o
"std::__throw_bad_alloc()", referenced from:
__gnu_cxx::new_allocator<std::_List_node<int> >::allocate(unsigned long, void const*) in ccPxxPwU.o
"std::_List_node_base::_M_hook(std::_List_node_base*)", referenced from:
void std::list<int, std::allocator<int> >::_M_insert<int const&>(std::_List_iterator<int>, int const&&&) in ccPxxPwU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [func] Error 1
为什么这不起作用?
【问题讨论】:
-
不是你遇到的问题,但我认为通过引用而不是值接受函子会更好。
-
@Ben:通常你想按值取值,因为如果函子是可变的,它仍然可以工作。如果您真的不想制作副本,
std::ref会解决这个问题。 @Austin:std::for_each也可以。 :P -
@GMan,嗯,是的,但重点是玩新东西......:D
-
@GMan:如果您在 lambda 中捕获了变量,按值传递不会中断连接吗?
-
@Ben:不。 Lambda 不是可复制分配的,但它们具有隐式生成的复制构造函数(和移动构造函数)。当函数被调用时,它将被复制构造,这也将绑定副本的引用,就像它们在原始 lambda 中一样。
标签: c++ debugging lambda c++11