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 :

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>();	
}
Quand je compile avec g++, voici le message d'erreur :
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
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)
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>();
	}
};
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 ?