Re: Inserting objects into a std::map?
On 29 mar, 13:46, Paul Brettschneider <paul.brettschnei...@yahoo.fr>
wrote:
James Kanze wrote:
On Mar 27, 10:04 pm, Paul Brettschneider
<paul.brettschnei...@yahoo.fr> wrote:
saneman wrote:
[...]
Another thing. When I make:
std::map<Bob, int> m;
And my Bob class does not define '<' operator why does
the compiler not complain in the above declaration of
'm'?
Its first when I insert that the compiler complains about
the missing operator in Bob:
It's the way templates work: functions/methods are only
instantiated when you use them. Since Key::operator<() is not
needed for constructing an empty map, the compiler doesn't
complain.
Or it does (g++, for example). The current standard says it's
undefined behavior, so anything the implementation does is
legal.
I cannot reproduce this on g++:
Are you using the normal options for standard conformant code?
I get:
Gabi (10): cat nocmp.cc
#include <map>
class A {
} ;
int
main()
{
std::map< A, int > m ;
}
Gabi (11): g++ --version
g++ (GCC) 4.2.1 (SUSE Linux)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
Gabi (12): g++ -std=c++98 -ffor-scope -fno-gnu-keywords -foperator-
names -pipe -Wall -W -Wno-sign-compare -Wno-deprecated -Wno-non-
virtual-dtor -Wpointer-arith -Wno-unused -Wno-switch -Wno-missing-
field-initializers -ggdb3 -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -
D_GLIBCXX_DEBUG_PEDANTIC nocmp.cc
/usr/include/c++/4.2.1/bits/stl_function.h: In member function
'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with
_Tp = A]':
/usr/include/c++/4.2.1/bits/boost_concept_check.h:359:
instantiated from 'void __gnu_cxx::_BinaryFunctionConcept<_Func,
_Return, _First, _Second>::__constraints() [with _Func = std::less<A>,
_Return = bool, _First = A, _Second = A]'
/usr/include/c++/4.2.1/bits/stl_map.h:106: instantiated from
'std::__norm::map<A, int, std::less<A>, std::allocator<std::pair<const
A, int> > >'
/usr/include/c++/4.2.1/debug/map.h:51: instantiated from
'std::__debug::map<A, int, std::less<A>,
std::allocator<std::pair<const A, int> > >'
nocmp.cc:9: instantiated from here
/usr/include/c++/4.2.1/bits/stl_function.h:227: error: no match
for 'operator<' in '__x < __y'
This is under Linux, here, but I got the same thing under
Solaris on a Sparc at work.
Obviously, you've got to demand error checking, or you won't get
it. Like every other compiler I've used, the default options
are never what you want.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34