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 :

C++ typeid() sans warning du compilateur


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut C++ typeid() sans warning du compilateur
    Bonjour,

    j'ai du mal à poster un message. Je ne sais le faire qu'ici.

    Voilà mon problème : je code en C++ avec QTCreator sous Windows ; et je veux utiliser typeid(), mais le compilateur m'affiche des warnings (mais le code compile et s'exécute toutefois) du style <<format '%d' expects argument of type 'int' but argument 3 has type 'double'>> et ceci pour chaque ligne. Savez-vous comment faire pour faire disparaître les warnings du compilateurs svp ?

    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
    #include <typeinfo>    // typeid
     
    template <class T>
    void List<T>::print() const
    {
      for (ent i = 0 ; i < _size ; ++i)
      {
             if (typeid(T) == typeid(char       ) || typeid(T) == typeid(unsigned char     )) printf("List[%lld] = %c\n"  ,i,_list[i]);
        else if (typeid(T) == typeid(short      ) || typeid(T) == typeid(unsigned short    )) printf("List[%lld] = %hd\n" ,i,_list[i]);
        else if (typeid(T) == typeid(int        ))                                            printf("List[%lld] = %d\n"  ,i,_list[i]);
        else if (                                    typeid(T) == typeid(unsigned int      )) printf("List[%lld] = %u\n"  ,i,_list[i]);
        else if (typeid(T) == typeid(long       ) || typeid(T) == typeid(unsigned long     )) printf("List[%lld] = %ld\n" ,i,_list[i]);
        else if (typeid(T) == typeid(long long  ) || typeid(T) == typeid(unsigned long long)) printf("List[%lld] = %lld\n",i,_list[i]);
        else if (typeid(T) == typeid(float      ) || typeid(T) == typeid(double            )) printf("List[%lld] = %g\n"  ,i,_list[i]);
        else if (typeid(T) == typeid(long double))                                            printf("List[%lld] = %Lg\n" ,i,_list[i]);
        else                                                                                 {printf("Format not supported to print List<T>\n"); return;}
      }
    }
     
     
    dans le main :
    {
      List<char> charToto = List<char>(0); charToto << 'a' << 'b' << 'c';
      List<double> doubleToto = List<double>(0); doubleToto << 6.87 << 2.35 << 8.4865;
      charToto.print();
      doubleToto.print();
    }
    Merci de l'avoir déplacé. J'ai cherché toute la matinée et je viens de trouver une solution. je fais un cast devant le troisième argument du printf. Désolé pour vous avoir sollicité.

    Sujet résolu. Merci beaucoup.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 711
    Points : 2 346
    Points
    2 346
    Par défaut
    Bonjour.

    L'utilisation de printf est une contrainte ? Quitte à utiliser C++, on peut beaucoup simplifier le code avec les bonnes fonctions en utilisant std::cout ou std::print, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //#include <typeinfo>    // typeid . plus besoin
    #inlude <iostream>
     
    template <class T>
    void List<T>::print() const
    {
      for (ent i = 0 ; i < _size ; ++i)
      {
             std::cout << "List[" << i << "] = " << _list[i] << '\n';
      }
    }
    Si le but est de n'autoriser que certains types dans le template, on peut le faire simplement aussi de façon plus 'C++esque' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <type_traits>
     
    template <class T>
    void List<T>::print() const
    {
        static_assert(std::is_arithmetic<T>::value, "T doit être un type numérique");
        // le reste de la fonction
    }
    std::is_arithmetic<T>::value est vrai si T est numérique (permet d'utiliser les opérations mathématiques +, -, * et /), comme char, int, unsigned int, double, etc.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup. J'avais pas pensé à cout.

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 745
    Points : 3 660
    Points
    3 660
    Par défaut
    En restant sur une solution à base de printf (ce qui est quand même une mauvaise idée), c'est le genre de chose qui se résout facilement avec des if constexpr et std::is_same. Sortir typeid pour cela est carrément overkill.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             if constexpr (std::is_same_v<T, char       > || std::is_same_v<T, unsigned char     >) printf("List[%lld] = %c\n"  ,i,_list[i]);
        else if constexpr (std::is_same_v<T, short      > || std::is_same_v<T, unsigned short    >) ...
    Mais des surcharges de fonction (comme le fait std::ostream) reste plus souple.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour cette nouvelle réponse.

    J'ai essayé constexpres mais comme je travaille avec QT sous Windows, je ne pas accès au makefile (ou je ne sais pas comment faire) et au directives de compilation.

    A la compilation, j'ai le message suivant concernant is_same :
    << 'is_same_v' is not a member of 'std' >>.

    A la compilation, j'ai le message suivant concernant constexpres :
    << 'constexpres' does not name a type
    C++11 'constexpres' only available with -std=c++11 or -std=gnu++11 >>

    Le problème est toutefois déjà résolu.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Alors, deja, c'est le mot clé constexpr et non constexpres...

    Ensuite, ce mot clé est apparu en C++11 (donc, en ... 2011, ce qui fait un sérieux baille ) et l'utilisation de if constrexpr est autorisée, si je ne m'abuse, depuis C++17 (la norme de 2017), voire, au pire, depuis la norme C++20 (celle sortie en 2020)...

    Tout ce que tu as donc à faire, c'est de t'assurer que ton compilateur supporte la norme requise

    Ceci dit, si tu n'utilise pas une version de Qt qui date de Matusalem, (la version "en cours d'utilisation" est quand même la version 6.x depuis une belle paire d'années), ton compilateur devrait très largement supporter ce genre de fonctionnalité

    Quand au problème de " 'is_same_v' is not a member of 'std'", il y a deux solutions:

    Soit tu n'as pas inclu le fichier <type_traits>, car std::is_same_v est, au cas où tu n'aurais pas remarqué le préfixe std:: une fonctionnalité offerte par la biblitohèque standard, au travers du fichier qui repredrend un tas de type traits...

    Soit tu utilise un compilateur qui date d'avant C++17, vu que std::is_same_v est apparu à cette époque. Ce qui m'étonnerait quand même.

    Si tel est le cas, il faudra alors passer par std::enable_if, qui rend malgré tout les choses beaucoup plus ardues, mais qui reste bien préférable à l'utilisation de typeid
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2022
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2022
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup. Je vois que je dois beaucoup apprendre.

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

Discussions similaires

  1. ignorer les warning du compilateur microsoft
    Par mamelouk dans le forum Visual C++
    Réponses: 8
    Dernier message: 18/06/2008, 10h06
  2. Exécution sans WARNINGS
    Par nahlette dans le forum Prolog
    Réponses: 6
    Dernier message: 25/11/2007, 15h30
  3. Caster sans warning
    Par Gwindor dans le forum C++
    Réponses: 6
    Dernier message: 03/04/2007, 13h24
  4. Warnings du compilateur
    Par kromartien dans le forum Erreurs - Avertissements
    Réponses: 3
    Dernier message: 07/03/2007, 09h44
  5. Warning : Compilateur BCC 5.5
    Par Henri dans le forum Windows
    Réponses: 4
    Dernier message: 03/01/2006, 11h02

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