2012-04-14 25 views
5

जब मैं अपने प्रोग्राम कोड को यह टुकड़ा पिछले पंक्ति जोड़ें:जीसीसी-4.7 संकलन त्रुटि

g++-4.7 -o /home/kron/Software/Synchronizer/1.0/Main.o -c src/Main.cpp 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h: In instantiation of ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Job]’: 
/usr/include/c++/4.7/bits/stl_tree.h:1285:4: required from ‘std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = Job; _Val = Job; _KeyOfValue = std::_Identity<Job>; _Compare = std::less<Job>; _Alloc = std::allocator<Job>]’ 
/usr/include/c++/4.7/bits/stl_set.h:415:29: required from ‘std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const value_type&) [with _Key = Job; _Compare = std::less<Job>; _Alloc = std::allocator<Job>; typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator = std::_Rb_tree_const_iterator<Job>; std::set<_Key, _Compare, _Alloc>::value_type = Job]’ 
src/Configuration.hpp:60:27: required from here 
/usr/include/c++/4.7/bits/stl_function.h:236:22: error: no match for ‘operator<’ in ‘__x < __y’ 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: candidates are: 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0, 
       from /usr/include/c++/4.7/bits/char_traits.h:41, 
       from /usr/include/c++/4.7/ios:41, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_pair.h:218:5: note: template<class _T1, class _T2> bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) 
/usr/include/c++/4.7/bits/stl_pair.h:218:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::pair<_T1, _T2>’ 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:68:0, 
       from /usr/include/c++/4.7/bits/char_traits.h:41, 
       from /usr/include/c++/4.7/ios:41, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_iterator.h:299:5: note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&) 
/usr/include/c++/4.7/bits/stl_iterator.h:299:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::reverse_iterator<_Iterator>’ 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:68:0, 
       from /usr/include/c++/4.7/bits/char_traits.h:41, 
       from /usr/include/c++/4.7/ios:41, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_iterator.h:349:5: note: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&) 
/usr/include/c++/4.7/bits/stl_iterator.h:349:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::reverse_iterator<_IteratorL>’ 
In file included from /usr/include/c++/4.7/string:54:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/basic_string.h:2566:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&) 
/usr/include/c++/4.7/bits/basic_string.h:2566:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’ 
In file included from /usr/include/c++/4.7/string:54:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/basic_string.h:2578:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) 
/usr/include/c++/4.7/bits/basic_string.h:2578:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’ 
In file included from /usr/include/c++/4.7/string:54:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/basic_string.h:2590:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&) 
/usr/include/c++/4.7/bits/basic_string.h:2590:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: mismatched types ‘const _CharT*’ and ‘Job’ 
In file included from /usr/include/c++/4.7/vector:65:0, 
       from src/Main.cpp:2: 
/usr/include/c++/4.7/bits/stl_vector.h:1372:5: note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_vector.h:1372:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::vector<_Tp, _Alloc>’ 
In file included from /usr/include/c++/4.7/set:60:0, 
       from src/Configuration.hpp:4, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_tree.h:873:5: note: template<class _Key, class _Val, class _KeyOfValue, class _Compare, class _Alloc> bool std::operator<(const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&, const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_tree.h:873:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>’ 
In file included from /usr/include/c++/4.7/set:61:0, 
       from src/Configuration.hpp:4, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_set.h:721:5: note: template<class _Key, class _Compare, class _Alloc> bool std::operator<(const std::set<_Key, _Compare, _Alloc>&, const std::set<_Key, _Compare, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_set.h:721:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::set<_Key, _Compare, _Alloc>’ 
In file included from /usr/include/c++/4.7/set:62:0, 
       from src/Configuration.hpp:4, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_multiset.h:702:5: note: template<class _Key, class _Compare, class _Alloc> bool std::operator<(const std::multiset<_Key, _Compare, _Alloc>&, const std::multiset<_Key, _Compare, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_multiset.h:702:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::multiset<_Key, _Compare, _Alloc>’ 
In file included from /usr/include/c++/4.7/list:64:0, 
       from /usr/include/boost/algorithm/string/std/list_traits.hpp:15, 
       from /usr/include/boost/algorithm/string/std_containers_traits.hpp:20, 
       from /usr/include/boost/algorithm/string.hpp:18, 
       from src/Configuration.hpp:9, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_list.h:1659:5: note: template<class _Tp, class _Alloc> bool std::operator<(const std::list<_Tp, _Alloc>&, const std::list<_Tp, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_list.h:1659:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::list<_Tp, _Alloc>’ 
In file included from /usr/include/c++/4.7/deque:65:0, 
       from /usr/include/boost/algorithm/string/find_format.hpp:14, 
       from /usr/include/boost/algorithm/string/replace.hpp:22, 
       from /usr/include/boost/algorithm/string.hpp:25, 
       from src/Configuration.hpp:9, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_deque.h:274:5: note: template<class _Tp, class _Ref, class _Ptr> bool std::operator<(const std::_Deque_iterator<_Tp, _Ref, _Ptr>&, const std::_Deque_iterator<_Tp, _Ref, _Ptr>&) 
/usr/include/c++/4.7/bits/stl_deque.h:274:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::_Deque_iterator<_Tp, _Ref, _Ptr>’ 
In file included from /usr/include/c++/4.7/deque:65:0, 
       from /usr/include/boost/algorithm/string/find_format.hpp:14, 
       from /usr/include/boost/algorithm/string/replace.hpp:22, 
       from /usr/include/boost/algorithm/string.hpp:25, 
       from src/Configuration.hpp:9, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_deque.h:282:5: note: template<class _Tp, class _RefL, class _PtrL, class _RefR, class _PtrR> bool std::operator<(const std::_Deque_iterator<_Tp, _RefL, _PtrL>&, const std::_Deque_iterator<_Tp, _RefR, _PtrR>&) 
/usr/include/c++/4.7/bits/stl_deque.h:282:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::_Deque_iterator<_Tp, _RefL, _PtrL>’ 
In file included from /usr/include/c++/4.7/deque:65:0, 
       from /usr/include/boost/algorithm/string/find_format.hpp:14, 
       from /usr/include/boost/algorithm/string/replace.hpp:22, 
       from /usr/include/boost/algorithm/string.hpp:25, 
       from src/Configuration.hpp:9, 
       from src/Main.cpp:5: 
/usr/include/c++/4.7/bits/stl_deque.h:1947:5: note: template<class _Tp, class _Alloc> bool std::operator<(const std::deque<_Tp, _Alloc>&, const std::deque<_Tp, _Alloc>&) 
/usr/include/c++/4.7/bits/stl_deque.h:1947:5: note: template argument deduction/substitution failed: 
In file included from /usr/include/c++/4.7/string:50:0, 
       from /usr/include/c++/4.7/bits/locale_classes.h:42, 
       from /usr/include/c++/4.7/bits/ios_base.h:43, 
       from /usr/include/c++/4.7/ios:43, 
       from /usr/include/c++/4.7/ostream:40, 
       from /usr/include/c++/4.7/iostream:40, 
       from src/Main.cpp:1: 
/usr/include/c++/4.7/bits/stl_function.h:236:22: note: ‘const Job’ is not derived from ‘const std::deque<_Tp, _Alloc>’ 
make: *** [/home/kron/Software/Synchronizer/1.0/Main.o] Error 1 

यह मेरी गलती है:

typedef std::set<Job> JobSet; 
typedef boost::shared_ptr<JobSet> JobSetPtr; 
JobSetPtr jobs_; 

jobs_->insert (job); // line 60 

मैं इस त्रुटि मिलती है? यदि हां, तो मैंने क्या गलत किया? यदि नहीं, क्या किसी के पास एक ही त्रुटि है?

+1

आप 'नौकरी' को कैसे परिभाषित करते हैं? – Shep

+1

मुझे यकीन नहीं है, लेकिन 'जॉब' को 'ऑपरेटर <' अधिभार की आवश्यकता हो सकती है। – chris

उत्तर

10

ऐसा लगता है कि आप टाइप Job की दो वस्तुओं की तुलना करने के लिए < ऑपरेटर की एक परिभाषा प्रदान नहीं की है।

जब आप std::set में कोई ऑब्जेक्ट डालते हैं, तो कंटेनर को उस स्थिति को जानने की आवश्यकता होती है जहां उसे आइटम डालना चाहिए, जिसके लिए इसे सेट में पहले से मौजूद वस्तुओं के साथ ऑब्जेक्ट-टू-डाइ-डालने की आवश्यकता होती है। ऐसा करने के लिए, यह < ऑपरेटर का उपयोग करता है जो मुझे लगता है कि आपने प्रदान नहीं किया है। std::set<Job> बस Job प्रकार की दो वस्तुओं की तुलना करने के बारे में नहीं जानता है।

तो आप Job कक्षा के लिए operator< प्रदान कर सकते हैं।

या, वैकल्पिक रूप से, इस functor Job वस्तुओं की तुलना करने के लिए निर्धारित किए हैं:

struct JobComparer 
{ 
    bool operator()(Job const &j1, Job const &j2) 
    { 
     //compare j1 and j2 and return true or false 
    } 
}; 

तो के रूप में उपयोग:

typedef std::set<Job, JobComparer> JobSet; 

या, आप explained here रूप std::less विशेषज्ञ सकता है।

आपके पास इस विषय देख सकते हैं:

+4

मैन, जीसीसी त्रुटि लॉग कभी-कभी अति-अनुपयोगी होते हैं। स्पष्टीकरण के लिए धन्यवाद। विवरण के लिए – metamorphosis

6

नवाज एक सरल उत्तर प्रदान किया, लेकिन मैं इसे एक और अधिक पूरा एक के हकदार लगता है।

एऑब्जेक्ट्स, सी ++ में, कोई डुप्लीकेट वाले ऑर्डर किए गए कंटेनर हैं। वस्तुओं को ऑर्डर करने में सक्षम होने के लिए यह ऑब्जेक्ट के अलावा अन्य टेम्पलेट पैरामीटर का उपयोग करता है: एक मज़ेदार जिसका काम दो ऑब्जेक्ट्स की तुलना करना है। यह मेमोरी आवंटन के लिए तीसरे पैरामीटर का भी उपयोग करता है, यहां बेकार है।

struct NameComparator { 
    template <typename T> 
    bool operator()(T const& left, T const& right) { 
     return left.name() < right.name(); 
    } 
}; 

std::set<Job, NameComparator> JobSet; 

तुलनित्र आदेश के कुछ धारणा परिभाषित करना चाहिए प्रदान की है:

आप एक set का उपयोग करते हैं तो आपके पास दो मापदंडों प्रदान करते हैं।मूल रूप से, दो पूर्णांकों के लिए कैसे < काम के बारे में सोच:

  • यह irreflexive है: x < x कभी नहीं रखती
  • यह antisymmetric है: अगर x < y तो y < x झूठी
  • है यह सकर्मक है: अगर x < y और y < z तो x < z

चूंकि यह एक आम संबंध है, ऐसे मज़ेदार मानक पुस्तकालय में मौजूद हैं: template <typename T> struct std::less;, जो काम करता है किसी भी प्रकार के T के लिए दिए गए दो उदाहरणों के लिए आप ऑपरेटर < का उपयोग कर सकते हैं।

और जैसा कि है, set का दूसरा पैरामीटर, जिसे आपने स्पष्ट रूप से इंगित नहीं किया है, std::less<TypeOfObjectInSet> पर डिफ़ॉल्ट है। जिसका मतलब यह है कि ऑब्जेक्ट्स के साथ प्रदान किए जाने पर यह बॉक्स से बाहर काम करता है जिसके लिए < परिभाषित किया गया है।

इसलिए, आपके पास 3 समाधान हैं।

यदि आपकी वस्तुएं "प्राकृतिक" ऑर्डर संबंध स्वीकार करती हैं, तो आप या तो operator< परिभाषित कर सकते हैं या std::less विशेषज्ञ कर सकते हैं। अन्यथा, अगर आपको इस सेट के लिए कुछ ऑर्डर रिलेशनशिप की आवश्यकता है तो आप अपना खुद का तुलनित्र प्रदान कर सकते हैं।

ध्यान दें कि यदि आदेश आवश्यक नहीं है, तो आप unordered_set का उपयोग कर सकते हैं। इसके लिए हैशिंग और समानता संबंध की आवश्यकता है।

+0

+1। – Nawaz