2012-04-14 142 views
5

当我从这个片段的最后一行添加到我的程序代码:GCC-4.7编译错误

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

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

我得到这个错误:

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 

这是我的错吗?如果是,我做错了什么?如果不是,有人有相同的错误?

+1

你如何定义'工作'? – Shep 2012-04-14 17:10:58

+1

我不确定,但'Job'可能需要一个'operator <'过载。 – chris 2012-04-14 17:14:31

回答

10

看来你没有提供<运营商的定义比较Job类型的两个对象。

当您将对象插入到std::set中时,容器需要知道应该插入项目的位置,为此需要将要插入的对象与已存在的项目进行比较。要做到这一点,它使用<运营商,我想你还没有提供。 std::set<Job>根本不知道如何比较Job类型的两个对象。

所以,你可以为Job类提供operator<

,或者,定义该函子来比较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; 

或者,你可以专注std::lessexplained here

你可以看到这个话题:

+4

有时候,GCC错误日志是超级无用的。感谢您的解释。 – metamorphosis 2015-12-06 00:42:30

6

谢里夫提供了一个简单的答案,但我认为它值得更完整的一个。

对象的set,在C++中,与没有重复的有序容器。为了能够排序对象,它使用除对象本身之外的第二个模板参数:一个函数,其作用是比较两个对象。 它也使用第三个参数进行内存分配,这里没用。

当您使用set您提供两个参数:

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

std::set<Job, NameComparator> JobSet; 

提供应定义的顺序一些概念比较。基本上,想怎么<工作,为两个整数:

  • 是漫反射:x < x从不保存
  • 是反对称:如果x < y然后y < x是假
  • 传递性:如果x < yy < z然后x < z

由于这是一种常见的关系,所以在标准库中存在这样的仿函数:template <typename T> struct std::less;,其工作s为任何类型T对于给定的两个实例,您可以使用运算符<

而且,您没有明确指出的第二个参数set默认为std::less<TypeOfObjectInSet>。这意味着只要提供了定义了<的对象,它就可以开箱即用。

因此,你有3个解决方案。

如果您的对象承认“自然”顺序关系,那么您可以定义operator<或专门std::less。否则,如果你只需要这个集合的一些订单关系,那么你可以提供你自己的比较器。

请注意,如果订单是而不是需要,那么您可以使用unordered_set。它需要散列和平等关系。

+0

+1了解详情。 – Nawaz 2012-04-14 18:04:12