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! ]