问题
When I add the last line from this snippet to my program code:
typedef std::set<Job> JobSet;
typedef boost::shared_ptr<JobSet> JobSetPtr;
JobSetPtr jobs_;
jobs_->insert ( job ); // line 60
I get this error:
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
Is it my fault? If yes, what I did wrong? If no, does somebody have the same error?
回答1:
It seems you've not provided a definition of <
operator to compare two objects of type Job
.
When you insert an object into std::set
, the container needs to know the position where it should insert the item, for which it needs to compare the object-to-be-inserted with the items already present in the set. To do that, it uses <
operator which I guess you've not provided. std::set<Job>
simply doesn't know how to compare two objects of type Job
.
So you could provide operator<
for Job
class.
Or, alternatively, define this functor to compare Job
objects:
struct JobComparer
{
bool operator()(Job const &j1, Job const &j2)
{
//compare j1 and j2 and return true or false
}
};
then use it as:
typedef std::set<Job, JobComparer> JobSet;
Or, you could specialize std::less
as explained here.
You could see this topic:
- std::set with user defined type, how to ensure no duplicates
回答2:
Nawaz provided a simple answer, but I think it deserves a more complete one.
A set
of objects, in C++, is an ordered container with no duplicates. To be able to order objects it uses a second template parameter other than the object itself: a functor whose job is to compare two objects. It also uses a 3rd parameter for memory allocation, useless here.
When you use a set
you provide two parameters:
struct NameComparator {
template <typename T>
bool operator()(T const& left, T const& right) {
return left.name() < right.name();
}
};
std::set<Job, NameComparator> JobSet;
The comparator provided should define some notion of order. Basically, think of how <
work for two integers:
- it is irreflexive:
x < x
never holds - it is antisymmetric: if
x < y
theny < x
is false - it is transitive: if
x < y
andy < z
thenx < z
Since this is such a common relationship, such a functor exists in the standard library: template <typename T> struct std::less;
, which works for any type T
for with given two instances you can use the operator <
.
And as it is, the second parameter of set
, which you did not explicitly indicated, defaults to std::less<TypeOfObjectInSet>
. Which means it just works out of the box when provided with objects for which <
is defined.
Therefore, you have 3 solutions.
If your objects admits a "natural" order relation, then you can either define operator<
or specialize std::less
. Otherwise, if you just need some order relationship for this set then you can provide your own comparator.
Note that if order is not required, then you can use an unordered_set
. It requires hashing and an equality relationship.
来源:https://stackoverflow.com/questions/10155571/gcc-4-7-compilation-error