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 :

Bug dans la FAQ C++ ? (les templates de Loulou24)


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut Bug dans la FAQ C++ ? (les templates de Loulou24)
    Bonjour,
    je me demande s'il n'y a pas un bug dans la FAQ a propos des template ? accessible a cette url : http://c.developpez.com/faq/cpp/?pag...creation_class

    voilà, je suis en train d'eviter de tout mettre dans mon header (enfin je cherche a bien séparer définition et déclaration), et comme j'ai des doutes sur la syntaxe je suis partie voir la FAQ... avant de venir pleurnicher ici (ce que je ne vais pas tardé a faire ).

    et là, j'avoue que j'ai un serieux doute, quand je copie la déclaration de la classe Exemple dans un fichier "aaa.h"
    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
     
    #include <iostream> 
     
    template <typename T> 
    class Exemple 
    { 
    public : 
     
        Exemple(const T& Val = T()); 
     
        template <typename U> 
        Exemple(const Exemple<U>& Copy); 
     
        const T& Get() const; 
     
        template <typename T2> 
        friend std::ostream& operator <<(std::ostream& Stream, const Exemple<T2>& Ex); 
     
    private : 
     
        T Value; 
    };
    et que je mets toutes les definitions (le reste, sauf le main) dans un fichier aaa.c
    avec bien sur le "include" qui va bien, et bien ca ne compile pas sous VS6sp6.
    a mon faible niveau j'ai réussi a compiler en changeant les lignes
    suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename T> 
    //template <typename U> 
    Exemple<T>::Exemple(const Exemple</*U*/>& Copy) : .....
    voilà, est-ce un bug ?
    avec ceet correction ca compile mais est-ce que ca focntionen comme prévu ? j'en sais rien je ne sais pas trop ce que c'est sensé faire (il me manque des explications pour mon niveau)

    bon ensuite quand j'essaye de compiler le main, c'est pire...

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui c'est un bug. VC6 supporte malheureusement mal les templates, et plus précisément dans ton cas les fonctions membres templates de classes templates. Solution : changer de compilo .

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    merci Loulou24 pour ta reponse rapide.

    C'est donc un bug de VC6 ! je suis décu.. mais je ne peux malheureusement pas changer de compilo (et puis ca coute cher un compilo)...
    il y aurait'il un moyen de donner une syntaxe qui compile sous VC 6 ?
    (j'espere que c'est possible, j'ai peur tout d'un coup )


    J'en profite pendant que j'ai l'auteur sous la main, est-ce que tu peux expliquer ce que fait lecode suivant ?
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <typename T> 
    template <typename U> 
    Exemple<T>::Exemple(const Exemple<U>& Copy) : 
    Value(static_cast<T>(Copy.Get())) 
    { 
        // Attention, ceci n'est pas le constructeur par copie ! 
    }
    car j'avoue que je ne comprends pas ...si la seule chose que je sais c'est que ce n'est pas le constructeur par copie? mais c'est QUOI alors ???

    d'avance merci !

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    il y aurait'il un moyen de donner une syntaxe qui compile sous VC 6 ?
    Je ne crois pas, malheureusement. N'ayant plus VC6 je ne peux pas essayer. Mais as-tu vraiment besoin de ce type de constructeur pour ta classe ?

    J'en profite pendant que j'ai l'auteur sous la main, est-ce que tu peux expliquer ce que fait lecode suivant ?
    C'est simplement un constructeur qui permet de créer un Truc<T> à partir d'un Truc<U>, comme on aurait pu faire un constructeur prenant en paramètre un string ou n'importe quoi d'autre. Ce n'est pas un constructeur par copie car Truc<T> et Truc<U> sont bien deux classes différentes, et le compilo ne s'en servira pas comme constructeur par copie même si T == U.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Truc<float> t1(3.5f);
     
    Truc<int> t2(t1); // appelle Truc<int>::Truc<float>(float)

Discussions similaires

  1. [FAQ] compter les occurences d'une chaîne dans un fichier
    Par cafeine dans le forum Contribuez
    Réponses: 3
    Dernier message: 25/07/2006, 12h21
  2. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 16h14

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