Bonjour!
Afin de simplifier mon code source qui est fort complexe et qui en plus me pose des problèmes avec les forwards déclaration.

J'essaye de créer une factory pour instancier automatiquement des objets d'une classe dérivée, en insérant une fonction non membre dans la classe dérivée qui instancie un objet ainsi qu'une macro ajoute automatiquement cette fonction avec comme nom create suivit de l'id du type de l'objet.
J'ai aussi besoin d'une autre fonction pour récupérer un pointeur sur la fonction d'instanciation pour instancier l'objet et la passer à la factory.

Cependant, ceci ne fonctionne pas, malgré que je déclare la fonction dans la macro, lorsque je veux récupérer un pointeur sur cette fonction il me dit que la fonction non membre n'est pas déclarée, voici le code de la macro :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#define REGISTER_DERIVED(ID, TYPE) \
friend TYPE* create##ID() { \
    return new TYPE(); \
} \
public : \
static void getCreateFunc (TYPE*(**func)()) { \
    *func = &create##ID; \
}
#define ALLOCATE(TYPE) \
using TP = typename std::remove_pointer<decltype(TYPE)>::type; \
TP*(*func)(); \
TP::getCreateFunc(&func); \
return (func)();

Voici ce que je veux faire dans la classe dérivée :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
REGISTER_DERIVED(BoundingPolyhedron, odfaeg::BoundingPolyhedron)

Ainsi ça m'ajoute automatiquement les fonctions createBoundingPolyhedron et getCreateFunc dans le fichier boudingPolyhedron.h et je peux allouer ça n'importe ou dans le programme sans plus avoir de problème avec les forwards déclaration.

Malheureusement ce code me donne une erreur en compilation que je ne comprend pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/../Graphics/../Math/../Core/serialization.h|14|error: ‘createBoundingPolyhedron’ was not declared in this scope|
Pourquoi il me dit que la fonction createBoundingPolyhedron n'existe pas, hors que je l'ai déclarée juste au dessus dans la macro ???

Merci.