Re: operator< for algorithms
On Apr 2, 2:17 pm, "Hicham Mouline" <hic...@mouline.org> wrote:
namespace NS1 { namespace NS2 {
template <typename T1, typename T2>
class C {
public:
typedef T1::xType xType;
typedef T1::yType yType;
You are, presumably, using an older compiler. The above
shouldn't compile (and won't with most newer compilers); you
need an additional typename.
...
private:
typedef std::pair< xType, yType> EntryType;
boost::array< EntryType , size > ContainerType;
....
};
...
}}
I need to use std::lower_bound and sorting algorithms on my
ContainerType.
That could be tricky if either xType or yType don't support
comparison. And if they both support <, then your EntryType
already has an operator<, which you don't want to change (since
that would confuse any reader). And if EntryType supports <,
then boost::array should as well. (I've not verified the
latter, but as far as I know, boost::array adheres to the
requirements of a container in the standard.)
Where (which namespace) and how can I define the operator<
comparing 2 EntryType for the std:: algorithms to use that
operator?
Note I use these std::algorithms only in member functions of
the C template. So I wish to define the operator< in a way
that is specific and visible only to C template.
That's a tricky one. The correct answer is: in the namespace
where one of the actual types was defined, i.e. where the T1 of
the instantiation was defined. Except that, as mentionned, you
can't define an operator< for EntryType or ContainerType, since
the standard already defines one.
If the standard operator isn't appropriate, then There are two
simple solutions:
-- Drop std::pair. Using it is probably an error anyway---do
the two components really have a semantic of "first" and
"second"? (There are cases where they do, but in those
cases, the standard operator is appropriate.) Just define a
nested class (or simply a struct) with the two types, and
the operator< defined as you want.
-- Don't use <. All of the functions involving order (sort,
lower_bound, etc.) have a overload taking an additional
argument specifying the ordering function. So you provide a
nested class (fuctional object) which defines the ordering
you want, and pass an instance of it to the function each
time.
--
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