PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.c++ > template template
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
template template

Réponse
 
LinkBack Outils de la discussion
Vieux 20/02/2008, 17h48   #1
Dimitri PAPADOPOULOS-ORFANOS
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut template template

Bonjour,

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>
class MyClass {
Container<int> container;
};

int main() {
MyClass<set> instance;
}

Ça ne compile plus avec la version 4.2.2 de GCC.

J'ai bien essayé de changer de :
template <template <class U> class Container>
en :
template <template <typename> class Container>
mais sans succès.

Est-ce le code ou le compilateur qui pose problème ? Comment modifier le
code pour que ça marche ?

Merci d'avance,
--
Dimitri Papadopoulos
  Réponse avec citation
Vieux 20/02/2008, 17h59   #2
Fabien LE LEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: template template

On Wed, 20 Feb 2008 18:48:44 +0100, Dimitri PAPADOPOULOS-ORFANOS :

>Ça ne compile plus avec la version 4.2.2 de GCC.


Mais encore ? As-tu un message d'erreur ?
  Réponse avec citation
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
Vieux 20/02/2008, 20h27   #4
Anthony Fleury
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: template template

Dimitri PAPADOPOULOS-ORFANOS a écrit :
> Bonjour,
>
> 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>
> class MyClass {
> Container<int> container;
> };
>
> int main() {
> MyClass<set> instance;
> }


Bonjour,

Ca n'aurait jamais dû compiler en fait.
Pour les template template parameters, il faut spécifier tous les
paramètres du template, donc pour std::set typiquement il faut spécifier
la fonction de comparaison et l'allocateur.

Pour corriger uniquement ce code-ci et le faire fonctionner :

#include <set>
using namespace std;

template <template <class T, class U, class V> class Container>
class MyClass {
Container<int, std::less<int>, std::allocator<int> > container;
};

int main() {
MyClass<set> instance;
}

Cela résoud le problème dans le cas unique de set, mais si MyClass est
instanciée avec un container ne prenant que 2 paramètres (vector, deque,
list), ca ne fonctionnera plus et je ne vois pas trop (comme ca sans
réflechir plus) comment résoudre ce problème...

Anthony
  Réponse avec citation
Vieux 21/02/2008, 10h09   #5
Dimitri PAPADOPOULOS-ORFANOS
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: template template

Bonjour,

Merci de vos conseils. Je pense qu'il va nous falloir enlever le
template et coder le type de container en dur. Une solution de de type
"traits" (si elle peut marcher) aurait pour nous le désavantage de :
1) perdre trop de temps à écrire le code,
2) en perdre 10 fois plus à le maintenir.

J'ai écrit :
> 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>
> class MyClass {
> Container<int> container;
> };
>
> int main() {
> MyClass<set> instance;
> }
>
> Ça ne compile plus avec la version 4.2.2 de GCC.


Pour info, le message d'erreur est :

template_template.cc: In function ‘int main()’:
template_template.cc:10: erreur:
type/value mismatch at argument 1 in template parameter list
for ‘template<template<class U> class Container> class MyClass’
template_template.cc:10: erreur:
expected a template of type ‘template<class U> class Container’, got
‘template<class _Key, class _Compare, class _Alloc> class std::set’
template_template.cc:10: erreur:
invalid type in declaration before ‘;’ token

Merci,
--
Dimitri Papadopoulos
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 17h55.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,15384 seconds with 13 queries