Bonjour,
J'ai écrit une classe singleton de fabrique générique, j'utilise ensuite une classe de base pour l'enregistrement des objets, et je voulais que cet enregistrement se fasse par une macro appelant une fonction privée de la classe de base.
Seulement, j'ai une erreur de compilation dans la fonction d'enregistrement dont je n'arrive pas à voir la cause.
ObjectFactory.h :
AbstractObject.h :
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 template<typename T_ID, typename T_BASE> class ObjectFactory : public QSharedData { typedef T_BASE* (ClassCreationFunc) (); QHash<T_ID, ClassCreationFunc*> m_registry; static QAtomicPointer<ObjectFactory> m_instance; static QMutex m_mutex; public : template<typename T_OBJECT> static T_BASE* derivedClassCreationFunc() { T_OBJECT* t = new T_OBJECT; T_BASE* c = dynamic_cast<T_BASE*>(t); if (!c) delete t; return c; } static bool registerObject(T_ID id, ClassCreationFunc* func) { typename QHash<T_ID, ClassCreationFunc*>::iterator it =m_registry.insert(std::pair<T_ID, ClassCreationFunc*>(id, func)); return(it != m_registry.end()); } T_BASE* create(T_ID id) { T_BASE* obj = 0; typename QHash<T_ID, ClassCreationFunc*>::iterator it = m_registry.find(id); if (it != m_registry.end()) { ClassCreationFunc* pFunc = it->second; obj = pFunc(); } return obj; } static QSharedDataPointer<ObjectFactory> getInstance() { if(!m_instance) { QMutexLocker locker(&m_mutex); if(!m_instance) { } } return m_instance; } #endif // OBJECTFACTORY_H
Le code qui pose problème, AbstractObject.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class AbstractObject { private : template<typename T_ID,typename T_OBJECT> bool _register_object(T_ID id); public: AbstractObject(); virtual ~AbstractObject(); #define REGISTER_OBJECT(T_ID,id,T_OBJECT) bool _FACTORY_REGISTERED_ = _register_object<T_ID,T_OBJECT>(id); };
Et le message du compilateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template<typename T_ID, typename T_OBJECT> bool AbstractObject::_register_object(T_ID id) { ObjectFactory<T_ID,AbstractObject> fac = ObjectFactory<T_ID,AbstractObject>::getInstance(); // la ligne qui provoque l'erreur : return fac.registerObject(id, ObjectFactory<T_ID, AbstractObject>::derivedClassCreationFunc<T_OBJECT>); }
J'ai retourné le problème dans tous les sens, et je n'arrive pas à voir d'où viens cette erreur.abstractobject.cpp: error: expected primary-expression before '>' token
Si quelqu'un pouvait m'aiguiller, je lui en serais reconnaissant
Merci par avance.
Partager