Bonjour,
J'ai une erreur dans mon code actuel dont je n'arrive pas a trouver la cause, je soupconne une subtilité du langage que je ne connais pas encore.
Le code suivant me permet de stocker une instance d'une classe de base dans un Storer, et une méthode templatée me permet de récupérer cette instance castée dans le type de la classe dérivée de mon choix. Le tout avec des smart pointers. Ca fait beaucoup de templates imbriqués.
Voici le code, réduit autant que j'ai pu :
Quand je compile avec g++, voici le message d'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
57
58 #include <iostream> #include <string> ///Smart pointer class template <typename T> class Sptr { protected: T* ptr; public: ///Default constructor explicit inline Sptr(T* p_pointer=0) : ptr(p_pointer) { } ///Casting template <typename CAST> inline Sptr<CAST> staticCast() const { return Sptr<CAST>( static_cast<CAST*>(ptr) ); } }; ///A class that stores an instance template <class T> class Storer { Sptr<T> m_pointer; public: Storer(Sptr<T> p_pointer) : m_pointer(p_pointer) { } ///retrieve the instance, casted to given type template <typename T2> inline Sptr<T2> getInstance() const { return m_pointer.staticCast<T2>(); } }; ///base class for testing class TestBase { public: int i; }; ///derived class for testing class TestDerived : public TestBase { public: int j; }; ///Specialisation of storer class TestStorer : public Storer<TestBase> { public: TestStorer(Sptr<TestBase> p_pointer) : Storer<TestBase>(p_pointer) { } }; int main() { Sptr<TestBase> derived(new TestDerived); TestStorer* store = new TestStorer(derived); Sptr<TestDerived> c = store->getInstance<TestDerived>(); }
Si je met l'implémentation de Storer directement dans TestStorer, et j'enlève ainsi un niveau de template, alors l'erreur disparait. (commenter la classe Storer et remplacer TestStorer)main.cpp: In member function ‘Sptr<CAST> Storer<T>::getInstance() const’:
main.cpp:28: error: expected primary-expression before ‘>’ token
main.cpp:28: error: expected primary-expression before ‘)’ token
Je ne vois vraiment pas ce qui a changé pour enlever l'erreur entre les deux versions. J'ai une méthode templatée dans une classe templatée qui appelle une méthode templatée de classe templatée, ca fait trop pour le compilateur peut etre ? Ou alors est-ce l'héritage d'une méthode templatée qui pose problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ///Specialisation of storer class TestStorer { Sptr<TestBase> m_pointer; public: TestStorer(Sptr<TestBase> p_pointer) : m_pointer(p_pointer) { } ///retrieve the instance, casted to given type template <typename T2> inline Sptr<T2> getInstance() const { return m_pointer.staticCast<T2>(); } };
Partager