[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Custom template iterator

maverik

11/7/2008 11:42:00 AM

Hi all.

I'm implementing class AbstractCollection - 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<typename T>
class AbstractCollection {
public:
AbstractCollection() : m_collection() {};
AbstractCollection(const AbstractCollection &collection);
AbstractCollection(const int n) : m_collection(n) {};

typedef std::vector<T>::iterator iterator; //
Try to define iterators for AbstractCollection
typedef std::vector<T>::const_iterator const_iterator;
private:
std::vector<T> m_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 AbstractCollection 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.
5 Answers

anon

11/7/2008 12:05:00 PM

0

maverik wrote:
> Hi all.
>
> I'm implementing class AbstractCollection - 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<typename T>
> class AbstractCollection {
> public:
> AbstractCollection() : m_collection() {};
> AbstractCollection(const AbstractCollection &collection);
> AbstractCollection(const int n) : m_collection(n) {};
>
> typedef std::vector<T>::iterator iterator; //
> Try to define iterators for AbstractCollection
> typedef std::vector<T>::const_iterator const_iterator;

The correct way is:
typedef typename std::vector<T>::const_iterator const_iterator;

> private:
> std::vector<T> m_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 AbstractCollection 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"

Salt_Peter

11/7/2008 9:14:00 PM

0

On Nov 7, 6:42 am, maverik <maverik.m...@gmail.com> wrote:
> Hi all.
>
> I'm implementing class AbstractCollection - 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<typename T>
> class AbstractCollection {
> public:
> AbstractCollection() : m_collection() {};
> AbstractCollection(const AbstractCollection &collection);
> AbstractCollection(const int n) : m_collection(n) {};

AbstractCollection( 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.begin(); }

and so on...

> typedef std::vector<T>::const_iterator const_iterator;
> private:
> std::vector<T> m_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 AbstractCollection 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 AbstractCollection since its not abstract?
How about Vector, Container or Collection.

maverik

11/8/2008 11:33:00 AM

0

Thank you guys.

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

Thanks, you are right.

Gennaro Prota

11/8/2008 1:18:00 PM

0

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 AbstractCollection 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/b...
Do you need expertise in C++? I'm available.

James Kanze

11/9/2008 12:08:00 PM

0

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 AbstractCollection 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.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34