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