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 :

Constructeurs et templates


Sujet :

C++

  1. #1
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 562
    Points : 7 263
    Points
    7 263
    Par défaut Constructeurs et templates
    Bonjour,


    J'ai une classe A qui possède deux constructeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A(const int error, const std::string& message = "", const char* filename = __FILE__, const int line = __LINE__);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A(const std::string& message, const char* filename = __FILE__, const int line = __LINE__);

    Pour me simplifier l'écriture, j'aurais aimé écrire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define A(a) A(a, __FILE__, __LINE__)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define A(a,b) A(a,b,__FILE__,__LINE__)
    Mais ce n'est pas possible car c'est une redéfinition de ma macro A...

    J'ai donc tenté une écriture à base de templates:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     template <typename T, typename A, typename B>
     T ctor(A a, B b){
    	return T(a, b, __FILE__, __LINE__);
     }
     
     template <typename T, typename A>
     T ctor(A a){
    	return T(a, __FILE__, __LINE__);
     }
    Mais l'ennui c'est que les __FILE__ et __LINE__ correspondent aux lignes de déclaration de mes templates et non aux lignes d'appel à ctor<A>(0, "toto") ou ctor<A>("titi") dans le code...

    J'avoue que je sèche un petit peu...
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

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

    Informations professionnelles :
    Activité : aucun

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

    Tu as déjà un problème bien plus embêtant d'ambiguïté de tes constructeur, parce que tu définis pour les deux une valeur par défaut pour chacun des paramètres requis...

    En effet, le premier constructeur fait que les signatures admises, du fait des valeurs par défaut, sont:
    • A()
    • A(int const)
    • A(int const, std::string const&)
    • A(int const, std::string const &, char * const)
    • A(int const, std::string const &, char * const, int const)
    Et le second constructeur fait que les signatures admises sont:
    • A()
    • A(std::string const&)
    • A(std::string const &, char * const)
    • A(std::string const &, char * const, int const)

    Tu remarquera que les deux constructeurs ont pour effet de permettre une signature ne prenant aucun argument

    De ce fait, lorsque tu décide d'invoquer
    le compilateur est incapable de déterminer s'il doit invoquer le premier ou le second constructeur...
    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

  3. #3
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 562
    Points : 7 263
    Points
    7 263
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Tu as déjà un problème bien plus embêtant d'ambiguïté de tes constructeur, parce que tu définis pour les deux une valeur par défaut pour chacun des paramètres requis...
    Ah oui en effet. C'est corrigé
    En revanche, ça ne change rien à mon problème de #define, qui vient du fait qu'il considère #define A(a,b) comme une redéfinition de #define A(a)...
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    En revanche, ça ne change rien à mon problème de #define, qui vient du fait qu'il considère #define A(a,b) comme une redéfinition de #define A(a)...
    Malheureusement, il n'y a pas de miracle. On ne peut pas surcharger une macro. Le seul moyen pour toi de t'en sortir serait d'avoir des constructeurs avec le même nombre d'arguments mais dont les types différeraient.

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je ne comprends pas pourquoi tu as besoin de macros. Les paramètres par défaut ne te suffisent pas ? J'ai loupé un truc ?

  6. #6
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 545
    Points
    545
    Par défaut
    Bonjour,
    Citation Envoyé par white_tentacle Voir le message
    Je ne comprends pas pourquoi tu as besoin de macros. Les paramètres par défaut ne te suffisent pas ? J'ai loupé un truc ?
    line contiendra la ligne où est déclarée le constructeur hors je pense que c'est la ligne d'invocation du constructeur qui est souhaitée ici.
    Pour les macros tu peux tenter quelque chose avec les arguments variables de macros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define A( ... ) (__VA_ARGS__,__FILE__,__LINE__)
    mais ce genre de macros ne résoudra pas tous les problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A * pA = new A(0,""); // Ok
    A a(0,""); // pas Ok
    Sinon, tu peux te servir d'une macro pour réduire __FILE__,__LINE__ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define FANDL __FILE__,__LINE__
    // ...
        A a(1,"1",FANDL);
        A b("2",FANDL);
        A * pA = new A(3,"3",FANDL);

  7. #7
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 562
    Points : 7 263
    Points
    7 263
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Je ne comprends pas pourquoi tu as besoin de macros. Les paramètres par défaut ne te suffisent pas ? J'ai loupé un truc ?
    C'est pour ne pas avoir à passer les "__FILE__, __LINE__" à chaque appel en fait.
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  8. #8
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 562
    Points : 7 263
    Points
    7 263
    Par défaut
    Citation Envoyé par gb_68 Voir le message
    Sinon, tu peux te servir d'une macro pour réduire __FILE__,__LINE__ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define FANDL __FILE__,__LINE__
    // ...
        A a(1,"1",FANDL);
        A b("2",FANDL);
        A * pA = new A(3,"3",FANDL);
    Oui, c'est ce que j'ai fini par faire.
    Merci à tous
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

Discussions similaires

  1. Constructeur variadic template
    Par DakM dans le forum Langage
    Réponses: 5
    Dernier message: 14/07/2013, 03h32
  2. Réponses: 6
    Dernier message: 27/01/2012, 16h54
  3. classe template pb constructeur
    Par ouinih dans le forum Langage
    Réponses: 6
    Dernier message: 16/08/2007, 19h02
  4. Réponses: 6
    Dernier message: 12/07/2007, 19h18
  5. Constructeur de copie et Template: Transtypage
    Par ikkyu_os dans le forum Langage
    Réponses: 9
    Dernier message: 26/12/2004, 23h29

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