Discussion: template template
Afficher un message
Vieux 20/02/2008, 19h49   #3
James Kanze
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut 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
  Réponse avec citation
 
Page generated in 0,06320 seconds with 9 queries