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 :

Template, Smart Pointer et Valeur par défaut


Sujet :

Langage C++

  1. #1
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut Template, Smart Pointer et Valeur par défaut
    Bonjour à tous j'ai une erreur de compilation des plus étonnantes. J'ai une classe NGKeyEvent. Une fonction membre statique templaté me permettant de créer un objet de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <NGType>
    static NGKeyEvent* Create(const NGResFramePtr& frame = NGResFramePtr());
    Voila la définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <>
    inline NGKeyEvent* NGKeyEvent::Create<NGKeyEvent::KEY_PRESSED>(const NGResFramePtr& frame)
    {
    	return NGMemoryManagerObject<NGKeyEvent>::GetPool().construct(NGKeyEvent::KEY_PRESSED, frame);
    }
    Jusque là rien de bien sorcier.
    Après au niveau de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case sf::Event::KeyPressed:
    {
    	event = NGKeyEvent::Create<NGEvent::KEY_PRESSED>();
    	break;
    }
    Pas de problème ça compile (bon j'ai simplifié ma fonction normalement je lui donne des infos mais sur l'event mais ça ne change strictement rien. Par contre si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case sf::Event::KeyPressed:
    {
    	event = NGKeyEvent::Create<NGEvent::KEY_PRESSED>();
    	break;
    }
    		case sf::Event::KeyReleased:
    {
    	event = NGKeyEvent::Create<NGEvent::KEY_RELEASED>();
    	break;
    }
    ça compile pas et le compilateur me met l'erreur : Error 1 error C2440: 'default argument' : cannot convert from 'const NGResFramePtr *' to 'const NGResFramePtr &' . Un autre exemple, celui la marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    event = NGKeyEvent::Create<NGEvent::KEY_PRESSED>();
    Celui la ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    event = NGKeyEvent::Create<NGEvent::KEY_PRESSED>();
    event = NGKeyEvent::Create<NGEvent::KEY_PRESSED>();
    L'erreur de compilation ne survient que quand il y a deux appels à cette fonctions, c'est quand même étonnant. J'ai une deuxième classe (pour gérer les boutons de la souris) qui est implémenté de la même façon et si je fais deux appels il me met une autre erreur encore plus déconcertante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error	1	fatal error C1001: An internal error has occurred in the compiler.

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Essaie voir de passer par copie plutot? Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <NGType>
    static NGKeyEvent* Create( NGResFramePtr frame = NGResFramePtr());
    Je pense qu ele probleme viens de là. Ne te soucie pas de la performance, ce genre de code est réduit à une construction de toutes façons. Passe toujours par copie.

  3. #3
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Non mais ça marche par copie certes, mais j'aimerais savoir quel est le problème avec mon passage en référence. Là c'est un petit objet c'est pas un problème mais si celui ci se pose de nouveau avec un objet plus conséquent je l'aurais dans l'os si j'ai pas compris l'erreur

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    J'ai simplifié ton problème en :
    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
    24
    25
    26
    27
    28
    #include <iostream>
     
    struct my_struct
    {
      enum nombre
      {
        zero, un, deux, trois
      };
     
      template<nombre n_t_>
      static inline int divise_par(int const & val= int())
      {
          return val/n_t_;
      }
    };
     
     
    template<> inline int my_struct::divise_par<my_struct::zero>(int const & val)
    {
      return val;
    }
     
    int main()
    {
        std::cout<<my_struct::divise_par<my_struct::un>()<<"\n";
        std::cout<<my_struct::divise_par<my_struct::zero>()<<"\n";
         return 0;
    }
    gcc (mingw) compile ce code sans problème mais pas visual C++.

    J'ai regardé en diagonale la norme mais rien d'évident ne m'est apparu.

    Vu qu'on ne prête qu'aux riches, j'aurais tendance à suspecter un bug de visual.

    J'aurais 2 remarques :
    => avec un gros objet, tu ne ferais pas une instanciation par défaut donc le problème ne se poserait pas
    => j'aime pas les arguments par défaut (sauf hack particulier) mais c'est tout personnel

  5. #5
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Merci ^^ je suspectais en effet un bug visual (ah bravo :o)
    Citation Envoyé par 3DArchi Voir le message
    => avec un gros objet, tu ne ferais pas une instanciation par défaut donc le problème ne se poserait pas
    C'est pas faux
    Citation Envoyé par 3DArchi Voir le message
    => j'aime pas les arguments par défaut (sauf hack particulier) mais c'est tout personnel
    Moi je les utilisent pas souvent mais l'envie m'en a pris, mais je crois que je vais m'en passer finalement.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est effectivement un bug dans VC++, lié au passage par référence constante d'un argument par défaut dans une spécialisation template.
    https://connect.microsoft.com/Visual...-default-value
    https://connect.microsoft.com/Visual...fault-argument

    Peux-tu passer par copie ton argument, plutôt que par référence constante ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Oui je peux, mais je vais plutôt enlever la valeur par défaut, c'est peut être pas le meilleur choix (bien que là c'est vraiment pas important) mais ça sera plus conforme avec ce que j'ai fais avant.

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Souvent ce que je fais quand j'ai besoin d'une valeur par défaut comme ça, c'est que j'en fait une constante (statique) (même si c'est la valeur d'un objet de base). Je sais pas si ça contourne le problème VS.

    Marrant, je bosse avec GCC4.4 actuellement et il me semble avoir eu le même souci la semaine dernière...

  9. #9
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Il me semble qu'en utilisant une constante ça passe oui mais j'ai pas envie de tout crader pour rien. J'ai jamais était confronté à ce bug c'est la première fois je voulais être sûr que c'était bien un bug de visual et que ça ne venait pas de moi, merci à tous

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'ai compilé un exemple réduit (enfin, mon voisin de table, je n'avais pas de compilo gcc sous la main) avec gcc une vielle version, la dernière stable, et celle en cours, et ça marchait avec toutes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Et apparemment sous visual ils sont pas près de résoudre le problème. Bon et bien tant mieux que je découvre ça maintenant, mon code est censé être portable si j'avais été sous linux j'aurais découvert ça plus tard ça aurait été moins cool

Discussions similaires

  1. Template valeur par défaut quelque soucis
    Par Zakaima dans le forum Débuter
    Réponses: 2
    Dernier message: 27/05/2012, 10h06
  2. Valeur par défaut dun DBLookupcombobox
    Par lol_adele dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/05/2004, 09h08
  3. Valeur par défaut dans une table objet
    Par Ricky81 dans le forum Oracle
    Réponses: 12
    Dernier message: 18/03/2004, 11h52
  4. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  5. Unique + valeur par défaut
    Par ketalie dans le forum Outils
    Réponses: 4
    Dernier message: 02/07/2003, 15h29

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