Forward declaring standard library classes

Chris Jefferson caj@cs.york.ac.uk
Thu Nov 18 22:09:00 GMT 2004


With regards earlier emails, I am now attempting to optimise sort to be 
more efficent when classes with an efficent swap are in use. Early 
results are impressive :)

However, my problem now is that I need to have some class which I 
specialise to decide when I should use the more efficent versions. My 
early version looks something like:

 template<typename _Tp>
    struct _UseSwap
    { enum{_M_type = 0};};

  template<typename _Tp>
    struct _UseSwap<std::vector<_Tp> >
    {enum{_M_type = 1};};

...etc.

However, I don't want to pull in <vector>, <list>, <deque>, <map>, 
etc... so I forward declare these classes. However, the following 
doesn't compile:

***
#include<functional>

namespace std
{
  template<typename _Tp>
  class allocator;
  template<class _Key, class _Compare = less<_Key>,
           class _Alloc = allocator<_Key> >
  class set;
}

#include<set>
***

complaining that I have redefined the default parameter to _Compare. It 
(unsuprisingly) doesn't work with my original version, where I also 
forward declare less.

At the moment I'm getting around this by simply including every standard 
container in stl_algo.h, but obviously this cannot continue. Any 
suggestions?

Sorry for possibly very stupid C++ programming question...

Chris



More information about the Libstdc++ mailing list