Re: template template
On Feb 20, 6:48 pm, Dimitri PAPADOPOULOS-ORFANOS
<papad...@shfj.REMOVE.cea.NOSPAM.fr> wrote:
> Le code suivant compilait très bien jusqu'à des versions relativement
> récentes de GCC (4.0.2 entre autres). J'avais d'ailleurs écrit ce code
> après avoir consulté ce newsgroup.
> #include <set>
> using namespace std;
> template <template <class U> class Container>
Note bien que ça ne permet la spécialisation qu'avec un template
à un seul paramètre. (Les collections de la norme en ont
toujours au moins deux, puisqu'il y a des allocateurs.)
> class MyClass {
> Container<int> container;
> };
> int main() {
> MyClass<set> instance;
> }
> Ça ne compile plus avec la version 4.2.2 de GCC.
Ce qui m'étonne un peu, c'est que ça a compilé avant. Il devait
y avoir une extension qui prenait en compte les paramètres par
défaut.
> J'ai bien essayé de changer de :
> template <template <class U> class Container>
> en :
> template <template <typename> class Container>
> mais sans succès.
Pour la plupart des collections de la norme :
template< template <class U, class A > class Container >
class MyClass
{
Container< int, std::allocator< int > > container ;
} ;
Pour set, il y a aussi le comparateur, donc :
template< template < class U, class C, class A > class Container >
class MyClass
{
Container< int, std::less< int >, std::allocator< int > >
container ;
} ;
(Et je ne crois pas qu'on peut surcharger les templates de
class.)
> Est-ce le code ou le compilateur qui pose problème ? Comment
> modifier le code pour que ça marche ?
C'est le code, mais je ne crois pas que tu es sorti de
l'auberge. Peut-être quelque chose avec des traits, ou de la
métaprogrammation. (On doit pouvoir différencier entre des
templates avec des fonctions du genre :
discriminator( ToTest< int >* = 0 ) ;
discriminator( ToTest< int, std::allocator< int > >* = 0 ) ;
discriminator( ToTest< int, std::less< int >, std::allocator< int
> >* = 0 ) ;
avec des types de rétour de tailles différentes, et une classe
de traits qu'on instancie selon la taile du type de rétour.)
--
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
|