Re: unordered_map with fwd-declared type
 
David Osborn wrote:
Are containers with forward-declared contained types valid if they're
not actually instantiated?
You mean as in a typedef, something like:
     typedef std::vector< T > VectorT ;
where T is incomplete.  If I understand correctly, this should
not trigger the instantiation of the template.  (Implicit
instantiation occurs when the compiler needs a complete type for
the type.)  And without an instantiation, there should be no
problem.
#include <list>
#include <map>
#include <tr1/unordered_map>
struct A
{
    std::list<A>::const_iterator iter1; // this works
Not with my compiler.  It's undefined behavior, according to the
standard, and g++, with the necessary flags to ensure maximum
compliance, rejects it.
Declaring a member variable requires a complete type.  So does
finding a type which is a member.  So:
     typedef std::list<A> ListA ;            //  OK
     std::list<A>         listA ;            //  undefined behavior
     typedef std::list<A>::iterator IterA ;  //  undefined behavior
     std::list<A>::iterator         iterA ;  //  undefined behavior
    
std::map<int, A>::const_iterator iter2; // and this works
Ditto.
    
std::tr1::unordered_map<int, A>::const_iterator iter3; // shouldn't
this work?
I doubt it.  I don't think that there's any exception for
unordered_map.  (There are exceptions for some of the tr1
classes which have been adopted, such as shared_ptr.)
};
--
James Kanze (GABI Software)             email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
                    Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
-- 
      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]