Custom template iterator

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • maverik

    Custom template iterator

    Hi all.

    I'm implementing class AbstractCollect ion - just a wrap on std::vector
    - to hide from clients the fact of using std::vector in the base
    (because in the future I may change vector to a list or another DS).
    So I try to do it in this way:

    template<typena me T>
    class AbstractCollect ion {
    public:
    AbstractCollect ion() : m_collection() {};
    AbstractCollect ion(const AbstractCollect ion &collection) ;
    AbstractCollect ion(const int n) : m_collection(n) {};

    typedef std::vector<T>: :iterator iterator; //
    Try to define iterators for AbstractCollect ion
    typedef std::vector<T>: :const_iterator const_iterator;
    private:
    std::vector<Tm_ collection;
    };

    But the complier complains:

    error C2146: syntax error : missing ';' before identifier 'iterator'
    ....

    Can you tell me how to do it in the right way (how can I define
    iterators for AbstractCollect ion using std::vector iterators)?
    It would be nice if you also tell me what's wrong with my method (or
    provide link to read about).

    Thanks.
  • anon

    #2
    Re: Custom template iterator

    maverik wrote:
    Hi all.
    >
    I'm implementing class AbstractCollect ion - just a wrap on std::vector
    - to hide from clients the fact of using std::vector in the base
    (because in the future I may change vector to a list or another DS).
    So I try to do it in this way:
    >
    template<typena me T>
    class AbstractCollect ion {
    public:
    AbstractCollect ion() : m_collection() {};
    AbstractCollect ion(const AbstractCollect ion &collection) ;
    AbstractCollect ion(const int n) : m_collection(n) {};
    >
    typedef std::vector<T>: :iterator iterator; //
    Try to define iterators for AbstractCollect ion
    typedef std::vector<T>: :const_iterator const_iterator;
    The correct way is:
    typedef typename std::vector<T>: :const_iterator const_iterator;
    private:
    std::vector<Tm_ collection;
    };
    >
    But the complier complains:
    >
    error C2146: syntax error : missing ';' before identifier 'iterator'
    ...
    >
    Can you tell me how to do it in the right way (how can I define
    iterators for AbstractCollect ion using std::vector iterators)?
    It would be nice if you also tell me what's wrong with my method (or
    provide link to read about).
    Search for "template dependent name"

    Comment

    • Salt_Peter

      #3
      Re: Custom template iterator

      On Nov 7, 6:42 am, maverik <maverik.m...@g mail.comwrote:
      Hi all.
      >
      I'm implementing class AbstractCollect ion - just a wrap on std::vector
      - to hide from clients the fact of using std::vector in the base
      (because in the future I may change vector to a list or another DS).
      Exactly, that should give you a clue why you get the error.
      A list and a vector do not have the same type of iterator.
      So I try to do it in this way:
      >
      template<typena me T>
      class AbstractCollect ion {
      public:
      AbstractCollect ion() : m_collection() {};
      AbstractCollect ion(const AbstractCollect ion &collection) ;
      AbstractCollect ion(const int n) : m_collection(n) {};
      AbstractCollect ion( const std::size_t n, const T& t)
      : m_collection(n, t) {};


      >
      typedef std::vector<T>: :iterator iterator;
      Since std::vector<T>: :iterator is a dependent type:

      typedef typename std::vector<T>: :iterator iterator;

      iterator begin() { return m_collection.be gin(); }

      and so on...
      typedef std::vector<T>: :const_iterator const_iterator;
      private:
      std::vector<Tm_ collection;
      >
      };
      >
      But the complier complains:
      >
      error C2146: syntax error : missing ';' before identifier 'iterator'
      ...
      >
      Can you tell me how to do it in the right way (how can I define
      iterators for AbstractCollect ion using std::vector iterators)?
      It would be nice if you also tell me what's wrong with my method (or
      provide link to read about).
      >
      Nothing wrong in encapsulating a std::vector,
      you are doing it exactly as planned.
      The only issue is the name AbstractCollect ion since its not abstract?
      How about Vector, Container or Collection.

      Comment

      • maverik

        #4
        Re: Custom template iterator

        Thank you guys.
        Nothing wrong in encapsulating a std::vector,
        you are doing it exactly as planned.
        The only issue is the name AbstractCollect ion since its not abstract?
        How about Vector, Container or Collection.
        Thanks, you are right.

        Comment

        • Gennaro Prota

          #5
          Re: Custom template iterator

          maverik wrote:
          Thank you guys.
          >
          >Nothing wrong in encapsulating a std::vector,
          >you are doing it exactly as planned.
          >The only issue is the name AbstractCollect ion since its not abstract?
          >How about Vector, Container or Collection.
          >
          Thanks, you are right.
          That's not the only issue. Check Item 2 in "Effective STL" by
          Scott Meyers:

          Beware the illusion of container-independent code

          --
          Gennaro Prota | name.surname yahoo.com
          Breeze C++ (preview): <https://sourceforge.net/projects/breeze/>
          Do you need expertise in C++? I'm available.

          Comment

          • James Kanze

            #6
            Re: Custom template iterator

            On Nov 8, 2:17 pm, Gennaro Prota <gennaro/pr...@yahoo.com wrote:
            maverik wrote:
            Nothing wrong in encapsulating a std::vector,
            you are doing it exactly as planned.
            The only issue is the name AbstractCollect ion since its not abstract?
            How about Vector, Container or Collection.
            Thanks, you are right.
            That's not the only issue. Check Item 2 in "Effective STL" by
            Scott Meyers:
               Beware the illusion of container-independent code
            Exactly. As long as the iterator is just a typedef, he's not
            encapsulating anything. To effectively encapsulate, he also has
            to encapsulate the iterator.

            --
            James Kanze (GABI Software) email:james.kan ze@gmail.com
            Conseils en informatique orientée objet/
            Beratung in objektorientier ter Datenverarbeitu ng
            9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

            Comment

            Working...