Re: Help... global iterator causes assertion failure
Lee wrote:
I'm a newbie, and don't know why the else-if statement fails. Besides, I
don't know how to check if the global iterator "m_iter" has been initialized
or not. Can someone answer them? Thanks In Advance...
Here's a possible solution (I haven't tried compiling it):
Add this code to a header (say null_container_it.h):
template <class Cont>
struct null_container_it
{
typedef typename Cont::iterator iterator;
typedef typename Cont::const_iterator const_iterator;
operator iterator() const
{
return s_cont.end();
}
operator const_iterator() const
{
return s_cont.end();
}
private:
Cont const s_cont;
};
template <class Cont>
Cont const null_container_it<Cont>::s_cont;
Now you can do:
#include <null_container_it.h>
typedef std::list<int> list_int;
list_int::iterator m_iter = null_container_it<list_int>();
void foo( list_int myList )
{
list_int::iterator itEnd = myList.end();
list_int::iterator it = myList.begin();
// The next IF is the only way that I know to find a list-iterator has
not been initialized.
if( m_iter._Mynode() == NULL ) // what is the better way?
if (m_iter == null_container_it<list_int>())
Note I haven't tested any of this! You could also get rid of the
conversion operators in null_container_it and replace them with explicit
static member functions, so you'd do e.g.
list_int::iterator m_iter = null_container_it<list_int>::it();
//or cit() for const_iterator
That gets around the problem of container types where const_iterator is
the same as iterator (there are of course other solutions to that problem).
Tom