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 :

Instanciation de templates


Sujet :

C++

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut Instanciation de templates
    Je pensais que lorsqu'on instanciais une classe template, toutes les fonctions membres (et non membres) de cette classe etaient alors declarees.
    Mais cela n'est visiblement pas le cas avec le code suivant ou la fonction membre "constraints" de la classe "IsDerivedFrom" comporte une erreur qui n'est pas vue a la compil alors qu'un objet de type "IsDerivedFrom" est bien cree :

    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
    29
     
    class Base {};
    class Derivee : public Base {};
     
    template <typename D, typename B>
    class IsDerivedFrom
    {
    	private:
    		void constraints(D* p);
     
    	protected:		
    		IsDerivedFrom() {}
    };
     
    template <typename D, typename B>
    void IsDerivedFrom<D, B>::constraints(D* p)
    {
    		B* pb(p);
    		pb = 1;  // erreur non detectee a la compil ...
    }
     
    template <typename T>
    class Widget : public IsDerivedFrom<T, Base>
    {};
     
    int main()
    {
    	Widget<Derivee> w;
    }
    Voila, ma question est simple, pourquoi l'erreur dans la fonction constraints n'est pas detectee a la compil alors qu'un objet de type Widget (qui derive de IsDerivedFrom) est bien instancie ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Une fonction membre d'une classe template n'est instanciée que si elle est utilisée. C'est pourquoi la compilation de ton code se déroule correctement.

  3. #3
    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 518
    Points
    41 518
    Par défaut
    Donc, tu auras sans doute de meilleurs résultats en plaçant ça dans le constructeur.
    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.

  4. #4
    screetch
    Invité(e)
    Par défaut
    visual c++ ne parse meme pas le template, il est possible que tu te retrouves avec du code qui n'est meme pas du code. je crois qu'il y a des options pour forcer la compil des membres d'un template.

    il y a aussi une syntaxe pour instancier explicitement une classe mais je ne me rappelle plus.

    oui c'est tres utile et precis, je sais

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Oui, en appelant la methode dans le constructeur ca marche

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    visual c++ ne parse meme pas le template, il est possible que tu te retrouves avec du code qui n'est meme pas du code. je crois qu'il y a des options pour forcer la compil des membres d'un template.
    Je ne savais pas. Mais c'est vrai que le code ci-dessous n'a pas le même comportement sous gcc et sous visual C++. C'est quand même assez génant surtout que l'idée de parser les templates est, si je ne m'abuses, relativement "vieille".
    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 <iostream>
     
    #ifdef _WIN32
    #define __PRETTY_FUNCTION__ __FUNCSIG__
    #endif
     
    void f(short)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
     
    template<typename T>
    void foo()
    {
      f(12);
    }
     
    void f(int)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
     
    int main(void)
    {
      foo<char>();
      return 0;
    }

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par screetch Voir le message
    il y a aussi une syntaxe pour instancier explicitement une classe mais je ne me rappelle plus.
    Je crois que c'est simplement un truc genre:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template  t_Ptr<rw::core::Namespace::Node>;

    Très utile pour 'exporter' une instanciation de template dans une DLL.
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template __declspec(dllexport) t_Ptr<rw::core::Namespace::Node>;
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    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
    A noter que quand on fait une instanciation explicite, toutes les fonctions membre sont créées, contrairement à une instanciation implicite où seul ce qui sert est créé.
    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.

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    j'aurais plutot dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template class t_Ptr<rw::core::Namespace::Node>;

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par vandamme Voir le message
    j'aurais plutot dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template class t_Ptr<rw::core::Namespace::Node>;
    Ah oui tiens !
    J'ai oublié de recopier les mots-clefs "class"
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/06/2012, 16h57
  2. Réponses: 2
    Dernier message: 14/04/2011, 14h29
  3. instanciation des templates
    Par guillaume07 dans le forum C++
    Réponses: 15
    Dernier message: 05/04/2011, 09h41
  4. Instanciation tableau templaté
    Par matyu dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2011, 20h45
  5. Instanciation static template
    Par etienne.bezout dans le forum C++
    Réponses: 4
    Dernier message: 03/12/2010, 17h16

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