IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Problème avec argument par défaut de templates


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut Problème avec argument par défaut de templates
    Bonjour à tous,

    Quelqu'un pourrait me dire pourquoi avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <iostream>
     
    using namespace std;
     
    class A {
    	public:
    	static void hello() {
    		cout << "hello" << endl;
    	}
    };
     
    template <class TEMPLATE=A> class B {
    	public:
    	static void run() {
    		TEMPLATE::hello();
    	}
    };
     
    int main() {
    	B::run();
    	return 0;
    }
    g++ retourne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    test.cc: In function ‘int main()’:
    test.cc:20:2: erreur: ‘template<class TEMPLATE> class B’ used without template parameters
    alors qu'un paramètre par défaut est bel et bien défini pour le template class B ?

    Merci d'avance pour la réponse .

    Benjamin

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonsoir,
    Il faut rajouter une paire de chevron vide. (je ne connais pas la raison profonde)


    PS : TEMPLATE comme nom de type n'est pas vraiment une bonne idée, car le lecteur peut confondre facilement avec le mot clé "template". En tout cas pour ma part il m'a fallu quelques secondes supplémentaires pour comprendre la déclaration de la classe. Traditionnellement on utilise plutôt qqchose comme "T" pour un nom de type template.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bonsoir,
    Il faut rajouter une paire de chevron vide. (je ne connais pas la raison profonde)


    PS : TEMPLATE comme nom de type n'est pas vraiment une bonne idée, car le lecteur peut confondre facilement avec le mot clé "template". En tout cas pour ma part il m'a fallu quelques secondes supplémentaires pour comprendre la déclaration de la classe. Traditionnellement on utilise plutôt qqchose comme "T" pour un nom de type template.
    Oui bien sur, j'utilise le T d'habitude et j'ai écrit ce code à l'arrache pour tester le comportement de g++ (pourquoi est-ce que j'ai choisir TEMPLATE dans le stress, aucune idée ).

    Merci pour cette indication. J'ai donc été obligé de renommer toutes mes classes et de définir un typedef avec leur nom d'origine.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T=A> class B { ... };
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <class T=A> class _B { ... };
    typedef _B<> B;
    Je trouve ça un peu lourd pour quelque chose d'aussi simple.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bonsoir,
    Il faut rajouter une paire de chevron vide. (je ne connais pas la raison profonde)
    Tu appelles f() et pas f. f désigne la fonction, f() l'appel.
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class T=A> class _B { ... };
    typedef _B<> B;
    _B est un template de classe (qui n'est pas un type, il faut éviter le classe template calque direct de l'anglais où le qualificatif précède le qualifié contrairement à l'usage le plus commun en français), et _B<> une spécialisation (qui elle est bien une classe; il fut un temps où en anglais on utilisait class template pour le template de classe et template class pour la spécialisation, grammaticalement c'est peut-être sensé, mais ça augmente pour sûr la confusion, même pour les anglophones, et c'est une terminologie que l'on ne devrait plus voir).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] Problème avec répertoire par défaut sous l'image picker
    Par jca38 dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 23/05/2012, 09h30
  2. Problème d'argument par défaut
    Par Grhyll dans le forum Général Python
    Réponses: 4
    Dernier message: 14/12/2010, 21h32
  3. Réponses: 1
    Dernier message: 27/01/2010, 12h00
  4. template, itérateurs et argument par défaut de fonction
    Par goran kajfes dans le forum Langage
    Réponses: 5
    Dernier message: 24/05/2009, 18h00
  5. Réponses: 3
    Dernier message: 28/11/2008, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo