2011-08-30 6 views
5

와 함께이 코드를 가지고있다. 내가 이해하는 것에서 (그리고 나는 여기서 꽤 틀릴 수도있다.) g ++은 뮤텍스가 const 값으로 전달된다는 것을 말해 주며, 왜 나는 볼 수 없다.표준 : 부스트 :: 뮤텍스의지도 이상한 행동

In file included from /usr/include/c++/4.4/utility:63, 
       from /usr/include/boost/config/no_tr1/utility.hpp:21, 
       from /usr/include/boost/config/select_stdlib_config.hpp:33, 
       from /usr/include/boost/config.hpp:40, 
       from /usr/include/boost/date_time/compiler_config.hpp:12, 
       from /usr/include/boost/date_time/posix_time/posix_time.hpp:14, 
       from prova.cpp:5: 
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = boost::shared_mutex]’: 
/usr/include/c++/4.4/bits/stl_map.h:450: instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
prova.cpp:66: instantiated from here 
/usr/include/c++/4.4/bits/stl_pair.h:84: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&) 
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _U2 = boost::shared_mutex, _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = boost::shared_mutex]’: 
/usr/include/c++/4.4/ext/new_allocator.h:105: instantiated from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>]’ 
/usr/include/c++/4.4/bits/stl_tree.h:371: instantiated from ‘std::_Rb_tree_node<_Val>* std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_create_node(const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_tree.h:881: instantiated from ‘std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(const std::_Rb_tree_node_base*, const std::_Rb_tree_node_base*, const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_tree.h:1215: instantiated from ‘std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique_(std::_Rb_tree_const_iterator<_Val>, const _Val&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Val = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_map.h:540: instantiated from ‘typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, const std::pair<const _Key, _Tp>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
/usr/include/c++/4.4/bits/stl_map.h:450: instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = boost::shared_mutex, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_mutex> >]’ 
prova.cpp:66: instantiated from here 
/usr/include/c++/4.4/bits/stl_pair.h:101: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&) 

어떻게 해결할 수 있습니까?

답변

11

STL 컨테이너에는 값 형식에 대한 복사 생성자가 필요합니다. 뮤텍스는 복사 할 수 없으므로 map에 직접 넣을 수는 없습니다. 대신 뮤텍스 (아마도 std::unique_ptr 또는 boost::ptr_map 경유)를 가리키는 포인터를 사용해야합니다.

+0

어쩌면 내 기술이 그렇게 강하지 않다 .. 어떻게 그럴 수 있니? 코드 좀 줄 수있어? – St0rM

+2

@ St0rM - 저는 표준 컨테이너에 더 많은 기술이 필요하다고 말하고 싶습니다. 자신이하는 일을 안다면 어떤 물건을 컨테이너에 직접 두는 것이 좋은 상황이 있습니다. 그러나 일반적으로 컨테이너에 객체에 대한 포인터를 두는 것을 고려해야합니다 ** (std :: map처럼) ** 객체는 아닙니다 **. 컨테이너는 적합하다고 생각되는대로 내부에서 객체를 복사 할 수 있으므로 생성자와 소멸자가 호출 될시기를 실제로 제어 할 수 없습니다. –

+3

@ 테드 : 당신은 일반적으로 의미하지 않는다, 그렇지? 컨테이너에있는 포인터는 대개 올바르지 않습니다. – GManNickG

0

std::map이 그것을 const boost::shared_mutex&을 전달하여 boost::shared_mutex의 복사 생성자를 호출하려고 나에게 보이지만, 그러한 생성자는 사용할 수 없습니다 : 부스트 뮤텍스와

/usr/include/c++/4.4/bits/stl_pair.h:84: error: no matching function for call to ‘boost::shared_mutex::shared_mutex(const boost::shared_mutex&)’ 
/usr/include/boost/thread/pthread/shared_mutex.hpp:47: note: candidates are: boost::shared_mutex::shared_mutex() 
/usr/include/boost/thread/pthread/shared_mutex.hpp:21: note:     boost::shared_mutex::shared_mutex(boost::shared_mutex&)