Bonjour à tous.
je possède une super classe A dont dérive les classes B, C et D.
Je souhaite qu'une fonction de la classe Info m'affiche connu si l'objet qu'on lui passe est du type A ou dérivé de A ou sinon inconnu.
Pour cela j'utilise donc la métaprogrammation en m'inspirant de cette page de wikipedia .
Voici le code :
Avec ce code, j'obtient l'erreur
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #include <iostream> class A{}; class B : public A{}; class C : public A{}; class D : public A{}; template <class H, class SousListe> struct ListeType {}; struct ListeFin {}; template <class T> class Node; // Spécialisation pour le type de fin de liste // C'est la super-classe template <> class Node< ListeFin > { public: template <class Z> void getPath(const Z& z) { std::cout << " inconnu" << std::endl; } }; template <class H,class SousListe> class Node< ListeType<H, SousListe> > : public Node<SousListe> { public: template <> void getPath(const H& h){ std::cout << "connu" << std::endl; } }; /* template <class H,class SousListe> template <> void Node< ListeType<H, SousListe> >::getPath(const H& h) { std::cout << " connu" << std::endl; } */ typedef ListeType<A, ListeType<B, ListeType<C, ListeType<D, ListeFin> > > > UneListeClasses; int main() { int i; A a; Node<UneListeClasses> node; node.getPath(a); B b; node.getPath(b); C c; node.getPath(c); return 0; }D'apres mes recherches, je n'ai pas le droit de specialiser dans la classe.explicit specialization in non-namespace ‘class Node<ListeType<H, SousListe> >’ scope.
Je comment donc la fonction dans la classe et je créer ce qui est commenté dans le code.
Mais ca ne compile pas, l'erreur est:
Une idée ?essaimetaprog.cpp:35: error: invalid explicit specialization before ‘>’ token
essaimetaprog.cpp:35: error: enclosing class templates are not explicitly specialized
essaimetaprog.cpp:35: error: no member function ‘getPath’ declared in ‘Node<ListeType<H, SousListe> >’
Merci.
Partager