Bonjour à tous
Désolé pour le titre imprécis, mais pas facile d'en trouver un pour mon problème.
Je possède une classe abstraite, nommée ici Driver, qui sert d'interface entre le programme et des API spécifiques (chaque dérivée de Driver implémente une API différente).
Pour des raisons diverses et justifiées, je me suis codé une petite classe proxy pour cacher les appels du genre Driver->SetSomeState(true) derrière des affectations du genre Driver->SomeState = true.
Voici un code complet minimal qui reproduit le problème (que j'explique juste après) :
Mon problème est que ce code est valide, mais ne compile pas (Visual C++ 8 me sort une internal compiler error, suivie d'un crash du compilateur).
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 class Driver; Driver* GlobalDriver; class Driver { private : virtual void SetSomeState(bool) {} public : template <typename T, void (Driver::*Func)(T)> struct State { State& operator =(T Value) { (GlobalDriver->*Func)(Value); return *this; } }; struct States { State<bool, &Driver::SetSomeState> SomeState; }; States TheStates; }; int main() { GlobalDriver = new Driver; GlobalDriver->TheStates.SomeState = true; return 0; }
J'ai isolé le problème :
Si les fonctions de Driver ne sont pas virtuelles cela compile, mais je suis obligé de les laisser virtuelles.
Si la classe States est définie en dehors de Driver cela compile, mais je ne peux pas non plus le faire car toutes deux sont dépendantes l'une de l'autre.
Je pourrais également intercaler une fonction non virtuelle entre ma classe State et l'appel à la fonction virtuelle, mais c'est exclu car je dois quoiqu'il arrive être certain qu'en mode release mon mécanisme de proxy ne laisse pas de trace (ie. soit équivalent à l'appel direct).
J'ai trituré le code dans tous les sens, mais sans jamais réussir à le faire compiler tout en gardant des fonctionnalités identiques.
Une idée ??
Partager