declaring a friend template function whose arguments are of type = private member type

Discussion in 'C++' started by Hicham Mouline, Mar 27, 2009.

  1. hello,
    I have

    template<typename CurveTraits>
    class TimeCurve1D
    {
    public:
    typedef typename CurveTraits::tType tType;
    typedef typename CurveTraits::fType fType;

    fType GetSomething() const;
    private:
    typedef std::pair<tType,fType>
    EntryType;
    typedef boost::array< EntryType, mContainerMaxSize > ContainerType;
    ContainerType
    m;
    size_t
    mContainerSize;
    };

    In GetSomething(), I use std::lower_bound( &m[0], &m[mContainerMaxSize],
    std::pair<t, NaN> )
    lower_bound uses operator< by default

    Where can I defined this operator< for EntryType?
    and how can I declare it a friend inside TimeCurve1D?

    I tried

    template<typename CurveTraits>
    class TimeCurve1D
    {
    .....
    friend bool operator< <CurveTraits>( const EntryType&, const EntryType&);
    .....
    };


    template<typename CurveTraits>
    inline bool operator<( const typename TimeCurve1D<CurveTraits>::EntryType&
    lhs,
    const typename TimeCurve1D<CurveTraits>::EntryType&
    rhs )
    {
    return lhs.first < rhs.first;
    }


    On instantiation, it said
    typedef struct std::pair<double, double> TimeCurve1D<...>::EntryType' is
    private

    but I am trying to make operator< friend...

    rds,
    Hicham Mouline, Mar 27, 2009
    #1
    1. Advertising

  2. 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 “less than” 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 “CurveTraits::tType” and
    “CurveTraits::fType” has “less than” operators defined. Note that you
    don’t have to define “bool operator < (const EntryType & lhs, const
    EntryType & rhs)” yourself.

    For example, let’s assume you have the following code that uses your
    “TimeCurve1D” 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
    Vladyslav Lazarenko, Mar 27, 2009
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mike
    Replies:
    9
    Views:
    359
  2. grbgooglefan
    Replies:
    2
    Views:
    408
    Pascal Bourguignon
    Jan 30, 2008
  3. grbgooglefan
    Replies:
    4
    Views:
    428
    Kenny McCormack
    Jan 30, 2008
  4. Cotangent Alpha
    Replies:
    0
    Views:
    417
    Cotangent Alpha
    Jun 27, 2010
  5. A L
    Replies:
    1
    Views:
    499
    Alf P. Steinbach /Usenet
    Aug 25, 2010
Loading...

Share This Page