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

C++ Discussion :

specialisation template & error à la compilation


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut specialisation template & error à la compilation
    Bonjour à tous,

    J'ai pondu une structure comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<int I>
    struct GetValue
    {
        static const int value;
    };
    Ensuite à différents endroits, dans des headers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<> const int GetValue<1>::value = 14;
    template<> const int GetValue<2>::value = 6;
    template<> const int GetValue<3>::value = 23;
    etc.
    Le soucis c'est que plusieurs fichiers *.cpp ont besoin de ces spécialisations, et autant sous Windows ça passe correctement, qu'avec g++ le linker râle :

    lib.a (obj1.o):(.rodata+0x448): définitions multiples de « GetValue<1>::value »
    lib.a (obj2.o):(.rodata+0x43c): défini pour la première fois ici
    
    Et ce pour toutes les valeurs de <I> que j'ai pu spécialiser
    Que puis-je faire dans ce cas ?

    Merci à vous,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Bonjour, il me semble que mettre l'affectation des valeurs dans un .cpp et non dans un .h résoudrait le problème ?

    Edit: humpf, ce sont des templates, si ce que je propose ne marche pas, ajouter en plus la déclaration de ces variables dans le .h sans les affecter peut peut-être aider .

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    Merci pour cette réponse.

    J'utilise ces valeurs dans d'autres structure, par exemple :

    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
     
    template<int V>
    struct SRun
    {
       static void run() {}
    };
     
    template<int I>
    struct STest
    {
       static void runValue()
       {
          SRun< GetValue<I>::value >::run();
       }
    };
    En mettant la spécialisation dans un fichier .cpp, sous visual studio ça provoque l'erreur :

    error C2975: 'V' : invalid template argument for 'SRun', expected compile-time constant expression
    Je continue de chercher mais si vous avez une solution, ce serait avec plaisir
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu devrais essayer avec une enum plutôt que static const int.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    D'apres moi les deux compilos ont raisons quand ils ralent et je ne vois pas comment utiliser les enums pour faire quelque chose qui ne soit pas egalement possible avec des int const.. Ma proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <int I> struct GetValue;
    template <> struct GetValue<1> { int const result = 14; };
    template <> struct GetValue<2> { int const result = 6; };
    template <> struct GetValue<3> { int const result = 23; };
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    D'apres moi les deux compilos ont raisons quand ils ralent et je ne vois pas comment utiliser les enums pour faire quelque chose qui ne soit pas egalement possible avec des int const.. Ma proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <int I> struct GetValue;
    template <> struct GetValue<1> { int const result = 14; };
    template <> struct GetValue<2> { int const result = 6; };
    template <> struct GetValue<3> { int const result = 23; };
    Bonjour,

    J'ai réussit à faire marcher le truc sous Linux & Windows.

    Il faut déclarer en entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <> struct GetValue<1> { static int const result; }
    Puis l'initialiser dans un fichier source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const GetValue<1>::result = 14;
    Sans le "static", ça ne fonctionne pas. Si je mets tout en un fichier source, ça me donne des symboles non définis sous Windows, si je mets tout dans une entête, ça me donne multiple symboles sous Linux, si je retire "static", ça me donne des erreurs comme quoi ça doit être "compile time".

    Ça fait beaucoup de code mais bon, c'est comme ça.

    En tout cas merci pour votre aide.

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  7. #7
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par mister3957 Voir le message
    Sans le "static", ça ne fonctionne pas.
    Le c++11, lui, permet la déclaration d'une valeur membre constante sans que celle-ci soit static.

  8. #8
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Bonjour,

    Le c++11, lui, permet la déclaration d'une valeur membre constante sans que celle-ci soit static.
    Seulement pour les types de bases non ? (Ici c'est un int ça devrait marcher)

  9. #9
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Pour tous les types.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct
    {
        std::string t = "toto";
        MaClass m = {24, t, "bidule"};
        std::vector<int> v = {12,13,34,53,36};
    };

  10. #10
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Bon à savoir, merci

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Il faut déclarer en entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <> struct GetValue<1> { static int const result; }
    La je suis d'accord, le static etait un oubli de ma part. Mais je suis vraiment surpris que tu ais besoin de separer l'initialisation.

    Citation Envoyé par PilloBuenaGente Voir le message
    Bonjour,
    Le c++11, lui, permet la déclaration d'une valeur membre constante sans que celle-ci soit static.
    Mais ca reste une variable membre et donc non utilisable comme il le desire, sans instance.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. [Smarty] Plusieurs répertoires de templates, un seul de compilation
    Par j0o0 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 28/06/2008, 00h19
  2. templates et erreur de compilation
    Par Rniamo dans le forum C++
    Réponses: 2
    Dernier message: 14/06/2008, 19h51
  3. runtime error ou compilation
    Par amazircool dans le forum Langage
    Réponses: 1
    Dernier message: 28/04/2008, 07h05
  4. [DEBUTANT][afxwin.h]Error de compilation /MD[d]
    Par magnus2005 dans le forum MFC
    Réponses: 7
    Dernier message: 27/03/2007, 18h41
  5. [MFC] Error de compilation
    Par jagboys dans le forum MFC
    Réponses: 3
    Dernier message: 08/02/2005, 13h18

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