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 :

Spécialisation de template


Sujet :

Langage C++

Vue hybride

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Par défaut Spécialisation de template
    Ce code ci-dessous compile sans problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template< class T >
    struct mystruct
    {
    	enum { value = 0 };
    };
     
    template<> struct mystruct< int > { enum { value = 1 }; };
     
    int main(int argc, char *argv[])
    {
    	return 0;
    }
    Alors que celui-ci renvoie ceci avec g++:
    template.cpp:10: erreur: explicit specialization in non-namespace scope «class mycl»

    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
    class mycl
    {
     
    	template< class T >
    	struct mystruct
    	{
    		enum { value = 0 };
    	};
     
    	template<> struct mystruct< int > { enum { value = 1 }; }; // Probleme
    };
     
    int main(int argc, char *argv[])
    {
    	return 0;
    }
    Je suis largué. J'ai cherché un peu dans le forum. J'ai trouvé des sujets liés mais j'arrive pas à comprendre.

    http://www.developpez.net/forums/sho...late+namespace
    http://www.developpez.net/forums/sho...late+namespace
    http://www.developpez.net/forums/sho...late+namespace
    http://www.developpez.net/forums/sho...ation+template
    http://www.developpez.net/forums/sho...ation+template

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Argh, je viens de tester: ton code compile avec visual2005

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Par défaut
    Mouais. J'ai trouvé une page en anglais qui en gros me fait comprendre qu'il faut revoir la théorie d'abord.

    C'est exactement le même problème.

    http://www.linuxquestions.org/questi...?postid=970273

    Le gars dit:
    1) si ca fonctionne dans MVS ca veut pas dire que c'est correct.
    2) il faut instancier la classe ou le template dans le main pour dire d'au moins vérifier que tout fonctionne
    3) ... jai pas compris le reste
    Edit: apparemment c'est impossible de spécialiser un template d'une classe sans spécialiser la classe aussi. D'où l'idée de revoir la théorie.

    M'enfin c'est pas clair du tout pour moi du coup je crois que c'est mieux de retourner dans les bouquins.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Sinon, la faq de developpez.com sur les templates, et en particulier celle-ci, semble insister sur le fait qu'il est préférable d'expliciter au compilateur que c'est un template sur un type. C'est à dire, concrètement, d'utiliser le mot-clé typename à la place de Class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class mycl
    {
     
    	template< typename T >
    	struct mystruct
    	{
    		enum { value = 0 };
    	};
     
    	template<> struct mystruct< int > { enum { value = 1 }; }; // Probleme
    };
    Peut-être...

  5. #5
    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 r0d
    Sinon, la faq de developpez.com sur les templates, et en particulier celle-ci, semble insister sur le fait qu'il est préférable d'expliciter au compilateur que c'est un template sur un type. C'est à dire, concrètement, d'utiliser le mot-clé typename à la place de Class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class mycl
    {
     
    	template< typename T >
    	struct mystruct
    	{
    		enum { value = 0 };
    	};
     
    	template<> struct mystruct< int > { enum { value = 1 }; }; // Probleme
    };
    Peut-être...
    C'est un tout autre probleme.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Par défaut
    Effectivement en reprenant le code posté sur linuxquestions, où il utilise typename aulieu de class, l'erreur est la même.

    http://www.linuxquestions.org/questi...?postid=970273


    Jean-Marc a donné la solution en placant la spécialisation en dehors de la class cela fonctionne.

    C'est formidable !

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur .NET/C/C++
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET/C/C++
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Par défaut
    Et maintenant petite question:
    On fait comment quand on veut spécialiser une fonction template membre d'une classe template?

  8. #8
    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 bobyjoe
    Alors que celui-ci renvoie ceci avec g++:
    template.cpp:10: erreur: explicit specialization in non-namespace scope «class mycl»

    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
    class mycl
    {
     
    	template< class T >
    	struct mystruct
    	{
    		enum { value = 0 };
    	};
     
    	template<> struct mystruct< int > { enum { value = 1 }; }; // Probleme
    };
     
    int main(int argc, char *argv[])
    {
    	return 0;
    }

    Je suis largué. J'ai cherché un peu dans le forum. J'ai trouvé des sujets liés mais j'arrive pas à comprendre.
    g++ a raison, on ne peut specialiser que dans le namespace et pas dans la classe (14.7.3/2 pour ceux qui veulent la reference) Solution:
    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
    class mycl
    {
     
    	template< class T >
    	struct mystruct
    	{
    		enum { value = 0 };
    	};
    };
     
    template<> 
    struct mycl::mystruct< int >
    {
       enum { value = 1 };
    };
    Et je n'ai pas le souvenir que ca doive changer en C++0X

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

Discussions similaires

  1. [Problème] Alias de spécialisation de template
    Par DocteurV dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2009, 17h09
  2. Spécialisation de template particulière
    Par Flo. dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2009, 22h18
  3. Spécialisation de template parametre avec Enum
    Par 3DArchi dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2008, 15h21
  4. Réponses: 8
    Dernier message: 24/04/2007, 22h09
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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