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.
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 #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 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
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
Merci pour votre aide !
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; }
Bonne journée
Partager