------- Comment #1 from fang at csl dot cornell dot edu 2007-04-03 19:45 ------- Funny you mention this, I've done exactly this in my own utility headers: create forward-declaration-only headers of STL containers and algorithms.
"STL/allocator_fwd.h": namespace std { template <class T> class allocator; } "STL/list_fwd.h" #include "STL/allocator_fwd.h" namespace std { template <class T, class A = allocator<T> > class list; } etc... I've even made typedef templates in some cases: namespace std { template <class T> struct default_vector { typedef vector<T, allocator<T> > type; } } Another possible advantage of doing this would be to facilitate separate template compilation of STL containers and their methods *without* relying on the "extern template" extension. (Has worked for me.) I've never sought to push this idea, as it might create a minor headache for co-developers who might suddenly find that including a header that only uses a forward-declared template class suddenly needs to include the full-definition header on the side to be able to use it. e.g. #include <STL/list_fwd.h> template <class T> void some_func(const std::list<T>& l) { ... } Uses of the header that don't instantiate some_func will compile fine, whereas instantiations will require the rest of <list>. I don't necessarily find this a bad idea, but it can be a source of problems. FWIW, I use autoconf to detect and conditionally include headers that we're not supposed to include directly, such as <bits/stringfwd.h>. #if HAVE_BITS_STRINGFWD_H #include <bits/stringfwd.h> #endif Compilation speedups have been noticeable. -- fang at csl dot cornell dot edu changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |fang at csl dot cornell dot | |edu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31464