2012-04-14 27 views
5

Kiedy dodać ostatnią linię z tym fragmencie do mojego kodu programu:GCC-4.7 Kompilacja

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

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

otrzymuję ten błąd:

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 

Czy to moja wina? Jeśli tak, to co zrobiłem źle? Jeśli nie, czy ktoś ma ten sam błąd?

+1

Jak zdefiniować "zadanie"? – Shep

+1

Nie jestem pewien, ale 'Job' może wymagać przeciążenia operatora' '. – chris

Odpowiedz

10

Wygląda na to, że nie podano definicji operatora < w celu porównania dwóch obiektów typu Job.

Po wstawieniu obiektu do std::set, kontener musi znać położenie, w którym powinien wstawić element, dla którego musi porównać obiekt do wstawienia z elementami już obecnymi w zestawie. Aby to zrobić, używa operatora <, który, jak sądzę, nie podałeś. std::set<Job> po prostu nie wie, jak porównać dwa obiekty typu Job.

Możesz więc podać operator< dla klasy Job.

Lub alternatywnie zdefiniować ten funktor porównać Job obiekty:

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

następnie użyć go jako:

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

Albo, można specjalizować std::less jak explained here.

Można zobaczyć ten wątek:

+4

Człowiek, logi błędów GCC są czasami nieprzydatne. Dziękuję za wyjaśnienie. – metamorphosis

6

Nawaz przewidzianego prostą odpowiedź, ale myślę, że zasługuje na pełniejszą jeden.

A obiektów, w C++, jest uporządkowanym kontenerem bez duplikatów. Aby móc zamawiać obiekty, wykorzystuje on drugi parametr szablonu inny niż sam obiekt: funktor, którego zadaniem jest porównywanie dwóch obiektów. Używa również trzeciego parametru do alokacji pamięci, tutaj bezużytecznego.

Podczas korzystania z set podać dwa parametry:

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

std::set<Job, NameComparator> JobSet; 

komparatora przewidzianego powinna określić pewne pojęcie porządku.Zasadniczo, myśleć o tym, jak < pracy dla dwóch liczb:

  • jest irreflexive: x < x nie posiada
  • jest antysymetryczny: jeśli x < y następnie y < x jest fałszywa
  • jest przechodnia: jeśli x < y i y < z następnie x < z

Ponieważ jest to taka wspólna relacja, taki funktor istnieje w standardowej bibliotece: template <typename T> struct std::less;, która działa s dla dowolnego typu T dla dwóch podanych przypadków można użyć operatora <.

I tak jak jest, drugi parametr z set, który nie został wyraźnie wskazany, domyślnie jest ustawiony na std::less<TypeOfObjectInSet>. Co oznacza, że ​​po prostu działa po wyjęciu z pudełka, gdy jest dostarczony z obiektami, dla których zdefiniowano <.

Dlatego masz 3 rozwiązania.

Jeśli twoje obiekty przyjmują "naturalną" relację zleceń, możesz zdefiniować operator< lub wyspecjalizować std::less. W przeciwnym razie, jeśli potrzebujesz tylko relacji zleceń dla tego zestawu, możesz podać swój własny komparator.

Należy pamiętać, że jeśli zamówienie ma numer , a nie wymagane jest, można użyć numeru unordered_set. Wymaga to mieszania i równości.

+0

+1 dla szczegółów. – Nawaz