Problem with wring my own iterator

M

mast4as

Hi everyone

I tried to copied the code of some program that uses their own
iterator to loop over some elements of map... The code seems simple
and works in the program I copied it from of course (and I can compile
it) but I can get my own version to work. I get this error message:

xx.cc: In member function ‘A::Iterator A::begin()’:
xx.cc:716: error: conversion from
‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, int> >’ to non-scalar
type ‘A::Iterator’ requested
xx.cc: In member function ‘int& A::Iterator::value() const’:
xx.cc:737: error: invalid initialization of reference of type ‘int&’
from expression of type ‘const int’

Could anyone please help me ? Thank you so much -c

class A
{
public:
A() {}
typedef std::map<std::string, int> MapStuff;

class Iterator;

Iterator begin();
Iterator end();
Iterator find( const char *name );

private:

MapStuff map;
};

class A::Iterator
{
public:
Iterator();

Iterator & operator ++ ();

const std::string & name () const;
int & value() const;

private:
//friend class A::ConstIterator;

A::MapStuff::iterator _i;
};


A::Iterator
A::begin()
{
return map.begin();
}

A::Iterator::Iterator () : _i()
{
// empty
}

A::Iterator & A::Iterator::eek:perator ++ ()
{
++_i;
return *this;
}

const std::string & A::Iterator::name () const
{
return _i->first;
}

int & A::Iterator::value() const
{
return _i->second;
}
 
V

Victor Bazarov

Hi everyone

I tried to copied the code of some program that uses their own
iterator to loop over some elements of map... The code seems simple
and works in the program I copied it from of course (and I can compile
it) but I can get my own version to work. I get this error message:

xx.cc: In member function ‘A::Iterator A::begin()’:
xx.cc:716: error: conversion from
‘std::_Rb_tree_iterator<std::pair<const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, int> >’ to non-scalar
type ‘A::Iterator’ requested
xx.cc: In member function ‘int& A::Iterator::value() const’:
xx.cc:737: error: invalid initialization of reference of type ‘int&’
from expression of type ‘const int’

Could anyone please help me ? Thank you so much -c

class A
{
public:
A() {}
typedef std::map<std::string, int> MapStuff;

class Iterator;

Iterator begin();
Iterator end();
Iterator find( const char *name );

private:

MapStuff map;
};

class A::Iterator
{
public:
Iterator();

Iterator& operator ++ ();

const std::string& name () const;
int& value() const;

private:
//friend class A::ConstIterator;

A::MapStuff::iterator _i;
};


A::Iterator
A::begin()
{
return map.begin();

There does not exist a conversion between a map::iterator and your
A::Iterator. Such a conversion is required here. Did you mean to say

_i = map.begin();
return *this;

? Otherwise consider defining a constructor which takes a
'map::iterator' as its argument (by value would be OK, I suppose).
}

A::Iterator::Iterator () : _i()

You default-initialize the contained iterator. What does that do, do
you know?
{
// empty
}

A::Iterator& A::Iterator::eek:perator ++ ()
{
++_i;
return *this;
}

const std::string& A::Iterator::name () const
{
return _i->first;
}

int& A::Iterator::value() const
{
return _i->second;
}

V
 
M

mast4as

Thanks a lot Victor

Not sure what I was doing wrong but decided to copy the original code
from the example I had and I got it to work with a simple A class. I
believe what you mentioned about the constructor taking a
'map::iterator' as its argument was the missing elements. Anyway.
Thought I would post the working code for other people to use later
one. Thanks again for your kind help...

ps: to your question about 'what does the constructor do' when I use
_i(), nope I am not sure what it does exactly ;-( but I will try to
find out.

-c

class A
{
public:
A() : _map() {}
typedef std::map<std::string, int> AttributeMap;

class Iterator;

Iterator begin ();
Iterator end ();
Iterator find (const char name[]);

private:

AttributeMap _map;
};

//----------
// Iterators
//----------

class A::Iterator
{
public:

Iterator ();
Iterator (const A::AttributeMap::iterator &i);

Iterator & operator ++ ();
Iterator operator ++ (int);

const std::string & name () const;
int & attribute () const;

private:

//friend class A::ConstIterator;

A::AttributeMap::iterator _i;
};


//-----------------
// Inline Functions
//-----------------

A::Iterator
A::begin ()
{
return _map.begin();
}

A::Iterator
A::end ()
{
return _map.end();
}


A::Iterator
A::find (const char name[])
{
return _map.find (name);
}

inline
A::Iterator::Iterator (): _i()
{
// empty
}


inline
A::Iterator::Iterator (const A::AttributeMap::iterator &i): _i (i)
{
// empty
}


inline A::Iterator &
A::Iterator::eek:perator ++ ()
{
++_i;
return *this;
}


inline A::Iterator
A::Iterator::eek:perator ++ (int)
{
Iterator tmp = *this;
++_i;
return tmp;
}


inline const std::string &
A::Iterator::name () const
{
return _i->first;
}


inline int &
A::Iterator::attribute () const
{
return _i->second;
}
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,781
Messages
2,569,615
Members
45,297
Latest member
EngineerD

Latest Threads

Top