Problem with wring my own iterator

Discussion in 'C++' started by mast4as, May 3, 2010.

  1. mast4as

    mast4as Guest

    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;
    }
     
    mast4as, May 3, 2010
    #1
    1. Advertising

  2. On 5/3/2010 10:58 AM, mast4as wrote:
    > 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
    --
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, May 3, 2010
    #2
    1. Advertising

  3. mast4as

    mast4as Guest

    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;
    }
     
    mast4as, May 4, 2010
    #3
    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. Stefan Siegl
    Replies:
    1
    Views:
    805
  2. =?Utf-8?B?SklNLkgu?=

    what is wring with this code?

    =?Utf-8?B?SklNLkgu?=, May 17, 2006, in forum: ASP .Net
    Replies:
    2
    Views:
    349
    =?Utf-8?B?SklNLkgu?=
    May 17, 2006
  3. Saverio M.
    Replies:
    0
    Views:
    556
    Saverio M.
    Jul 3, 2006
  4. David Filmer
    Replies:
    17
    Views:
    298
    J. Romano
    Aug 18, 2004
  5. Jim Anderson

    problem with iterator (map iterator)

    Jim Anderson, Jan 10, 2014, in forum: C++
    Replies:
    3
    Views:
    158
    Luca Risolia
    Jan 13, 2014
Loading...

Share This Page