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 :

Spécialisation de template


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Par défaut Spécialisation de template
    Bonsoir,

    Je bosse sur une classe lisant et écrivant des images en niveaux de gris et couleurs.
    J'ai donc commencé à la coder en template pour me faciliter la tâche

    J'essaye de faire une spécialisation sur une fonction membre mais je reçoit l'erreur :

    Image.tpp|52|multiple definition of `Image<unsigned char>::writePGM(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    Il me semble que ça se passe au niveau de l'édition des liens.

    Voici le code :

    Image.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    typedef unsigned char ubyte;
    typedef unsigned short ushort;
    typedef unsigned int uint;
     
    #include <stdexcept>
    #include <iostream>
    #include <fstream>
     
    #ifndef IMAGE_H
    #define IMAGE_H
     
     
    template <typename T>
    class Image {
            ushort m_width, m_height;
            T *m_array;
            Image();
        public:
            Image(ushort, ushort);
            Image(const Image&);
            ~Image();
     
            void printImage();
            void writePGM(std::ostream&, std::string);
            static Image<ubyte>* readPGM(std::istream&);
    };
     
    #include "../src/Image.tpp"
    #endif

    Code.tpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <>
    void Image<ubyte>::writePGM(std::ostream& os, std::string name) {
        //écriture de l'image
    }
     
    template <>
    Image<ubyte>* Image<ubyte>::readPGM(std::istream& is) {
        //lecture de l'image
    }
    J'ai pourtant cherché mais je retrouve cette syntaxe à chaque fois, j'ai du louper un truc...

    Merci d'avance

  2. #2
    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
    Par défaut
    Salut,

    Une spécialisation n'est pas inline par défaut à contrario de la version générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <>
    inline
    void Image<ubyte>::writePGM(std::ostream& os, std::string name) {
        //écriture de l'image
    }
    alors que tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    void Image<T>::printImage()
    {
    //....
    }

    Btw, T* => std::vector<T>.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,

    Une spécialisation n'est pas inline par défaut à contrario de la version générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <>
    inline
    void Image<ubyte>::writePGM(std::ostream& os, std::string name) {
        //écriture de l'image
    }
    Tout d'abord merci d'avoir répondu.

    La soluce fonctionne à merveille et j'aimerais comprendre pourquoi d'ailleurs ?
    Le inline ne sert-il pas à réduire le coût d'appel d'une fonction en substituant ses appels au compilateur par ses instructions ?


    Citation Envoyé par 3DArchi Voir le message
    Btw, T* => std::vector<T>.
    S'il n'en tenait qu'à moi je l'aurais bien fait avec la STL :p
    Malheureusement je dois respecter une certaine syntaxe et les vector n'en font pas partie

    En tout cas merci encore

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Argento.bu Voir le message
    Tout d'abord merci d'avoir répondu.
    La soluce fonctionne à merveille et j'aimerais comprendre pourquoi d'ailleurs ?
    Le inline ne sert-il pas à réduire le coût d'appel d'une fonction en substituant ses appels au compilateur par ses instructions ?
    Oui, en partie, mais pas seulement...

    D'abord, il faut savoir que le fait de déclarer une fonction inline ne fait que demander au compilateur de remplacer l'appel de la fonction par son code ibanire correspondant, mais qu'il reste tout à fait libre de le faire ou non (il peut, par exemple, décider de ne pas remplacer l'appel de la fonction par le code binaire correspondant si ce dernier est composé d'un nombre d'instructions trop important )

    Ensuite, il faut savoir que le mot clé inline a, également, un effet au niveau de l'édition de liens...

    Il permet en effet à l'éditeur de liens de ne pas s'étonner le code correspondant à un même symbole apparait plusieurs fois.

    C'est surtout cette deuxième caractéristiques qui nous intéresse ici
    S'il n'en tenait qu'à moi je l'aurais bien fait avec la STL :p
    Malheureusement je dois respecter une certaine syntaxe et les vector n'en font pas partie

    En tout cas merci encore
    Cela ne se remarque que pour ce qui est du comportement interne à la classe

    Tu peux très bien, si le besoin s'en fait sentir, créer une fonction qui renvoye l'adresse du premier élément sur ton std::vector
    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

  5. #5
    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
    Par défaut
    Salut,
    Pour inline, cf la réponse de Koala.
    Citation Envoyé par Argento.bu Voir le message
    S'il n'en tenait qu'à moi je l'aurais bien fait avec la STL :p
    Malheureusement je dois respecter une certaine syntaxe et les vector n'en font pas partie
    Ici, rien ne t'empêche de séparer la responsabilité de gestion du buffer de celle de la gestion de l'image => enveloppe RAII dédiée.

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

Discussions similaires

  1. Spécialisation de template particulière
    Par Flo. dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2009, 22h18
  2. Spécialisation de template parametre avec Enum
    Par 3DArchi dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2008, 15h21
  3. Spécialisation de template
    Par bobyjoe dans le forum Langage
    Réponses: 18
    Dernier message: 13/12/2007, 21h52
  4. Réponses: 8
    Dernier message: 24/04/2007, 22h09
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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