g++4.3.2 w/ c++0x: error: no type named ‘iterator’ in ‘class std::unordered_map<...'

S

Samuel.Hornus

Hi,
I have a problem with g++ 4.3.2 in -std=c++0x mode.
Here is some code which works fine:

struct My_data
{
typedef std::map<Key, My_data, Compare> My_Map; (***)
typedef typename My_map::iterator My_iterator;
// data members
My_iterator cousin_;
};
typedef std::map<Key, My_data, Compare> My_Map;
My_map Family;

Note, that it uses My_data as the data_value for the std::map type
defined in the My_data struct *itself*.
This works fine. But now I want to change std::map by
std::unordered_map.
So do I, with appropriate hash function and Equality comparator.
But then, g++ 4.3.2 gives me the following error:

error: no type named ‘iterator’ in ‘class std::unordered_map<...'
at line (***). I know this does come from the fact that I'm using
My_data as a template parameter inside the definition of the struct
My_data itself.
But... it did work for std::map... so why shouldn't it work for
unordered_map ?
Is there a workaround ? is this a bug of libstd++ ?
Thank you very much !
sam
 
A

Alan Johnson

Hi,
I have a problem with g++ 4.3.2 in -std=c++0x mode.
Here is some code which works fine:

struct My_data
{
typedef std::map<Key, My_data, Compare> My_Map; (***)
typedef typename My_map::iterator My_iterator;
// data members
My_iterator cousin_;
};
typedef std::map<Key, My_data, Compare> My_Map;
My_map Family;

Note, that it uses My_data as the data_value for the std::map type
defined in the My_data struct *itself*.
This works fine. But now I want to change std::map by
std::unordered_map.
So do I, with appropriate hash function and Equality comparator.
But then, g++ 4.3.2 gives me the following error:

error: no type named ‘iterator’ in ‘class std::unordered_map<...'
at line (***). I know this does come from the fact that I'm using
My_data as a template parameter inside the definition of the struct
My_data itself.
But... it did work for std::map... so why shouldn't it work for
unordered_map ?
Is there a workaround ? is this a bug of libstd++ ?
Thank you very much !
sam

This may have changed in C++0X (I haven't checked), but in the 2003
standard what you are doing is undefined behavior. You cannot
instantiate a template component for any of the standard library
templates with an incomplete type. Within the definition of My_data,
My_data is an incomplete type.

Reference 17.4.3.6.2 in the 2003 standard.
 
B

Bo Persson

Hi,
I have a problem with g++ 4.3.2 in -std=c++0x mode.
Here is some code which works fine:

struct My_data
{
typedef std::map<Key, My_data, Compare> My_Map; (***)
typedef typename My_map::iterator My_iterator;
// data members
My_iterator cousin_;
};
typedef std::map<Key, My_data, Compare> My_Map;
My_map Family;

Note, that it uses My_data as the data_value for the std::map type
defined in the My_data struct *itself*.
This works fine. But now I want to change std::map by
std::unordered_map.
So do I, with appropriate hash function and Equality comparator.
But then, g++ 4.3.2 gives me the following error:

error: no type named ‘iterator’ in ‘class std::unordered_map<...'
at line (***). I know this does come from the fact that I'm using
My_data as a template parameter inside the definition of the struct
My_data itself.
But... it did work for std::map... so why shouldn't it work for
unordered_map ?
Is there a workaround ? is this a bug of libstd++ ?
Thank you very much !
sam

It just happened to work for std::map, even though it is not required.

The workaround would possibly be to store a pointer or a reference to
the cousin, instead of an iterator.


Bo Persson
 
S

Samuel.Hornus

It just happened to work for std::map, even though it is not required.

The workaround would possibly be to store a pointer or a reference to
the cousin, instead of an iterator.

And said:
Reference 17.4.3.6.2 in the 2003 standard.

Thank you Alan and Bo for your prompt replies.
I'm very disappointed. It is very important for my algorithm
to store these iterators into the data_type itself. So I'll try to
hard code
the iterator type into my My_data structure, by copying from the
standard header.
I'll see if that works.
Do you know any reference explaining how we can achieve this somewhat
cleanly ?
Maybe using another template library. I don't care using something
other than the STL.
Thanks again,
sam
 

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,996
Messages
2,570,238
Members
46,826
Latest member
robinsontor

Latest Threads

Top