2011-08-30 12 views
5

साथ मैं इस कोड है। जो मैं समझता हूं उससे (और मैं यहां बहुत गलत हो सकता हूं) g ++ मुझे बता रहा है कि म्यूटेक्स को कॉन्स वैल्यू के रूप में पारित किया जा रहा है ... और मैं नहीं देख सकता क्यों।std :: बढ़ावा :: म्युटेक्स के नक्शे को अजीब व्यवहार

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

एसटीएल कंटेनरों को मूल्य प्रकार के लिए एक प्रतिलिपि बनाने की आवश्यकता होती है; चूंकि म्यूटेक्स की प्रतिलिपि नहीं बनाई जा सकती है, इसलिए आप उन्हें सीधे map में नहीं डाल सकते हैं। आपको एक म्यूटेक्स (शायद std::unique_ptr या boost::ptr_map के माध्यम से) के लिए एक सूचक का उपयोग करना होगा।

+0

शायद मेरे बढ़ावा mutexes के साथ कौशल इतना मजबूत नहीं है .. । आप वह कैसे करेंगें ? क्या आप मुझे कुछ कोड दे सकते हैं? – St0rM

+2

@ St0rM - मैं मानक कंटेनर के साथ अपने कौशल को और अधिक कहूंगा जिसके लिए काम की ज़रूरत है। ऐसी कुछ स्थितियां हैं जहां वस्तुओं को सीधे कंटेनर में रखना ठीक है यदि आप जानते हैं कि आप क्या कर रहे हैं। लेकिन आम तौर पर आपको ** कंटेनर ** (जैसे std :: map) में ऑब्जेक्ट्स को पॉइंटर्स डालना चाहिए, ** ऑब्जेक्ट्स इनसेवल्स ** नहीं। कंटेनर फिट बैठते समय आंतरिक रूप से ऑब्जेक्ट्स की प्रतिलिपि बना सकते हैं, इसलिए जब आप रचनाकारों और विनाशकों को बुलाएंगे तो आपके पास वास्तव में कोई नियंत्रण नहीं होगा। –

+3

@TED: आप वास्तव में सामान्य रूप से मतलब नहीं है, क्या आप? कंटेनर में पॉइंटर्स आमतौर पर सही नहीं है। – 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&) 
संबंधित मुद्दे