Alan Johnson
11/23/2008 9:30:00 AM
Samuel.Hornus@gmail.com wrote:
> 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.
--
Alan