2012-04-06 3 views
0

나는 다음과 같은 기능에 문제가 있어요 :(TR1)의 결합 (싸!)

Island::save 기능이 바인딩을 사용하여이

virtual void save(std::ostream& out) const; 

이 형식과 같은

typedef std::tr1::shared_ptr<Island> Island_sp_t; 
typedef map<string, Island_sp_t>::value_type island_map_pair; 

std::map<std::string, Island_sp_t> Island_ptr_map; 


void Model::save_all(ostream& out) 
{ 
    for_each(Island_ptr_map.begin(), Island_ptr_map.end(), bind(&Island::save, 
      bind<Island_sp_t>(&island_map_pair::second, _1), ref(out))); 
} 

지도가있는 곳은 지금까지 저에게 도움이되었지만이 특별한 경우에만 다음 플래그가있는 g ++ 4.1.2에서 다음과 같은 오류가 표시됩니다 :

g++ -c Pedantic -ansi -Wall 


/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/bind_iterate.h: In member function ‘typename std::tr1::result_of<_Functor()(typename std::tr1::result_of<std::tr1::_Mu<_T1, std::tr1::is_bind_expression<_T1>::value, (std::tr1::is_placeholder<_T1>::value > 0)>()(_T1, std::tr1::tuple<_U1, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass>)>::type, typename std::tr1::result_of<std::tr1::_Mu<_T1, std::tr1::is_bind_expression<_T1>::value, (std::tr1::is_placeholder<_T1>::value > 0)>()(_T2, std::tr1::tuple<_U1, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass, std::tr1::_NullClass>)>::type)>::type std::tr1::_Bind<_Functor()(_T1, 
_T2)>::operator()(_U1&) [with _U1 = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> 
>, std::tr1::shared_ptr<Island> >, _Functor = std::tr1::_Mem_fn<void (Island::*)(std::ostream&)const>, _T1 = std::tr1::_Bind_result<std::tr1::shared_ptr<Island>, std::tr1::_Mem_fn<std::tr1::shared_ptr<Island> std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> 
>, std::tr1::shared_ptr<Island> >::*>()(std::tr1::_Placeholder<1>)>, _T2 = std::tr1::reference_wrapper<std::basic_ostream<char, std::char_traits<char> > >]’: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:159: instantiated from ‘_Function std::for_each(_InputIterator, 
_InputIterator, _Function) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::tr1::shared_ptr<Island> > >, _Function = std::tr1::_Bind<std::tr1::_Mem_fn<void (Island::*)(std::ostream&)const>()(std::tr1::_Bind_result<std::tr1::shared_ptr<Island>, std::tr1::_Mem_fn<std::tr1::shared_ptr<Island> std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> 
>, std::tr1::shared_ptr<Island> >::*>()(std::tr1::_Placeholder<1>)>, std::tr1::reference_wrapper<std::basic_ostream<char, std::char_traits<char> > >)>]’ Model.cpp:179: instantiated from here /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/bind_iterate.h:45: error: no match for call to ‘(std::tr1::_Mem_fn<void (Island::*)(std::ostream&)const>) (std::tr1::shared_ptr<Island>, std::basic_ostream<char, std::char_traits<char> >&)’ /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/functional_iterate.h:261: note: candidates are: _Res std::tr1::_Mem_fn<_Res (_Class::*)(_T1)const>::operator()(const _Class&, _T1) const [with 
_Res = void, _Class = Island, _T1 = std::ostream&] /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/functional_iterate.h:267: note:     _Res std::tr1::_Mem_fn<_Res (_Class::*)(_T1)const>::operator()(const _Class*, _T1) const [with 
_Res = void, _Class = Island, _T1 = std::ostream&] /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/functional_iterate.h:274: note:     _Res std::tr1::_Mem_fn<_Res (_Class::*)(_T1)const>::operator()(_Tp&, _T1) const [with _Tp = std::tr1::shared_ptr<Island>, _Res = void, _Class = Island, _T1 = std::ostream&] /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/bind_iterate.h:45: error: return-statement with a value, in function returning 'void' make: *** [Model.o] Error 1 

모든 유형이 functional_iterate.h:274 후보와 잘 어울리는 것 같아서이 오류로 혼란 스럽습니다. 내가 누락 된 것에 대한 어떤 생각? 같은 모양 알고리즘을 따르도록 알고 싶은 사람들을위한

답변

0

, 나는 내 두 번째 바인드 인수에 "CONST"를 필요 :

for_each(Island_ptr_map.begin(), Island_ptr_map.end(), bind(&Island::save, 
      bind<const Island_sp_t>(&island_map_pair::second, _1), ref(out)));