Re: declaring a friend template function whose arguments are of type
= private member type
Basically, in your case EntryType type is always a specialization of
std::pair<> template. That template defines =93less than=94 comparator by
default, it looks like this (defined trough including 'utility' header
from STL):
template<class _T1, class _T2>
inline bool
operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
{ return __x.first < __y.first
|| (!(__y.first < __x.first) && __x.second < __y.second); }
So you are good as long as both types =93CurveTraits::tType=94 and
=93CurveTraits::fType=94 has =93less than=94 operators defined. Note that y=
ou
don't have to define =93bool operator < (const EntryType & lhs, const
EntryType & rhs)=94 yourself.
For example, let's assume you have the following code that uses your
=93TimeCurve1D=94 template:
struct A { int v; };
struct B { double v; };
struct my_curve_traits {
typedef A tType;
typedef B fType;
};
In order to get it working you have to write the following operators:
bool operator < (const A & lhs, const A & rhs) { return lhs.v <
rhs.v; }
bool operator < (const B & lhs, const B & rhs) { return lhs.v <
rhs.v; }
Note that you don't have to define those operators for POD types (line
int, double etc.). This is an example:
#include <utility>
#include <stdexcept>
#include <iostream>
#include <boost/array.hpp>
template<typename CurveTraits>
class TimeCurve1D
{
public:
typedef typename CurveTraits::tType tType;
typedef typename CurveTraits::fType fType;
fType GetSomething() const { throw std::runtime_error("Not
implemented"); }
private:
enum { mContainerMaxSize = 128 }; // You probably forgot to define
mContainerMaxSize...
typedef std::pair<tType,fType> EntryType;
typedef boost::array< EntryType, mContainerMaxSize > ContainerType;
ContainerType m;
size_t mContainerSize;
};
struct A { int v; };
struct B { double v; };
struct my_curve_traits {
typedef A tType;
typedef B fType;
};
typedef TimeCurve1D<my_curve_traits> my_curve_1d;
int main(int , char *[]) {
try {
my_curve_1d curve;
curve.GetSomething();
} catch(const std::exception & e) {
std::cout << "Here you go: " << e.what() << std::endl;
}
return 0;
}
Hope it helps!
---
Vladyslav Lazarenko