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 :

Variadic template et héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Par défaut Variadic template et héritage
    Bonjour à tous,

    J'ai un soucis avec les variadic template, j'ai illustré mon problème avec un exemple simple. J'ai une classe abstraite Addable<E> où une méthode add(const E&) est déclarée comme virtuelle pure ainsi que la version de cette même méthode add(const E&, const Args&...) utilisant les variadic template qui elle est définie et utilise la fonction virtuelle pure.

    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
     
    #ifndef ADDABLE_H
    #define ADDABLE_H
     
    template <typename E>
    class Addable {
    public:
     
        virtual void add(const E& element) = 0;
     
        template <typename ...Args>
        void add(const E& element, const Args&... args) {
            this->add(element);
            this->add(args...);
        }
    };
    #endif // ADDABLE_H
    Maintenant j'ai une classe Vector<E> qui hérite de Addable<E> et où je définie donc la fonction add(const E&) puisque virtuelle pure dans Addable<E>. Cette méthode ajoute simplement un nouvel élément dans mon std::vector<E> qui est encapsulé dans la classe Vector<E>.

    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
     
    #ifndef VECTOR_H
    #define VECTOR_H
     
    #include <vector>
    #include "Addable.h"
     
    template <class E>
    class Vector : public Addable<E> {
    private:
        std::vector<E> container_;
     
    public:
        Vector() {}
     
        void add(const E& element) {
            container_.push_back(element);
        }
    };
    #endif // VECTOR_H
    Maintenant voici mon main, où je crée un objet Vector<int> et appelle la fonction add() utilisant les variadic template. Hé bien ça ne compile pas alors que si j'ajoute la fonction utilisant les variadic template dans la classe Vector<E> plutôt que dans Addable<E> ça compile et fonctionne (exactement la même signature) !! Pourtant je fais un héritage public de la classe Addable<E>, alors pourquoi est-ce que la méthode n'est pas trouvée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "Vector.h"
     
    int main(int argc, char *argv[])
    {
        Vector<int> vec;
        vec.add(1, 4, 6, 7, 2, 1, 6, 8);
     
        return 0;
    }
    Merci pour votre aide !
    Bonne journée

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Rien à voir avec les templates, la déclaration de add dans vector cache les déclarations du même nom dans les classes de base, la solution est l'utilisation de using Addable<E>::add; dans vector.

    Ce phénomène n'est pas propre aux classes, il a aussi lieu pour les namespaces et les blocs (mais bon, ceux qui déclarent des fonctions dans les blocs n'ont que ce qu'ils méritent, nous sommes d'accord).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Par défaut
    Wow merci, ça fonctionne !!

    Je me coucherai moins bête

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

Discussions similaires

  1. Foncteur, variadic templates et héritage
    Par coda_blank dans le forum Langage
    Réponses: 8
    Dernier message: 02/10/2011, 22h15
  2. Template et héritage
    Par rooger dans le forum Langage
    Réponses: 5
    Dernier message: 22/07/2008, 13h48
  3. Foncteur, classes templates et héritage
    Par Floréal dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2007, 21h56
  4. Template ou héritage
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2006, 11h22
  5. patron, templates et héritages!
    Par kleenex dans le forum C++
    Réponses: 4
    Dernier message: 05/06/2006, 22h57

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