2010-04-19 4 views
3

Я просто ковыряться в какой-то новый материал в C++ 0x, когда я ударил камень преткновения:Неопределенные символы для C++ 0x lambdas?

#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 «S выход:

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 

Почему это не работает?

+0

не проблема у Вас есть, но я думаю, было бы лучше принять функтор по ссылке вместо значения. –

+1

@Ben: Обычно вы хотите взять его по значению, потому что, если функтор изменчив, он все равно будет работать. В случае, если вы действительно не хотите, чтобы копия была сделана, 'std :: ref' исправляет это. @Austin: 'std :: for_each' работает так же хорошо. : P – GManNickG

+0

@GMan, ну да, но дело было в том, чтобы играть с новыми вещами ...: D –

ответ

5

Это ошибки связи. Вам не хватает библиотеки C++? Что делать, если вы использовали i386-apple-darwin9-g++-4.5.0?

P.S. Я не могу проверить это, как я GCC 4.2.1 (i686-яблоко-darwin10-GCC-4.2.1) на моем Mac и получить:

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

Для поддержки 'C++ 0x' требуется ОЧЕНЬ новая версия' g ++ '. Но ваше предложение 'g ++' вместо 'gcc', вероятно, попадает в гвоздь по голове. –

+0

Как бы это получилось на этапе компоновщика, если gcc не распознал его как исходный файл C++? –

+0

Ну, тем не менее, он доходит до стадии ссылки, это, вероятно, проблема. Я получаю точно такие же ошибки при компиляции моего кода C++ 0x с gcc вместо g ++ с 4.5. –