Bonjour,
J'ai une application GUI qui fonctionne bien. Dans ma hiérarchie, j'ai une classe abstraite qui est la classe mère des différents menus (ceux qui affichent une liste sélectionnable). Je souhaite transformer cette classe en classe template dont le paramètre est le nombre d'éléments dans la liste à afficher. Je n'ai pas droit de faire de l'allocation dynamique d'où cette approche template pour dimensionner le tableau contenant les éléments. J'ai donc fait cette transformation et me retrouve dans une situation où mon code compile avec Visual Studio, avec IAR Embedded Workbench, mais plus avec MinGW. Il y a une erreur laconique sur l'appel d'une fonction template dans la classe template.
Je me suis battu pour arriver à un code minimaliste reproduisant le problème qui me confirme que Visual Studio accepte ce code que MinGW refuse. Je n'ai pas retesté ce code minimal avec IAR. Ici, je vois deux solutions :
- un bug dans MinGW
- un comportement non portable que MinGW refuse
Comme l'erreur est non explicite, je fais appel à votre expertise. Il y a beaucoup de fichiers, merci de votre patience
Page.hpp, qui contient la classe mère de toutes les pages et l'objet permettant de faire la navigation.
TempateMenuPage.hpp avec la fameuse classe template. Comme toutes les pages de menu doivent retourner à la page d'accueil, je met le gotoPage() dans cette classe. C'est ça qui pose soucis.
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 #ifndef PAGE_HPP #define PAGE_HPP class MyApplication { public: template<class NextPage> void gotoPage() { } }; class Page { public: virtual ~Page() { } virtual void handleEvent() = 0; MyApplication& getApplication() { static MyApplication application; return application; } }; #endif
MainMenuPage.hpp qui spécialise le template
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include "HomePage.hpp" #include "Page.hpp" template<int itemCount> class TempateMenuPage : public Page { public: void handleEvent() override { getApplication().gotoPage<HomePage>(); } };
MainMenuPage.cpp (je remet le gotoPage() pour tester et ici ça ne pose pas problème).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "TempateMenuPage.hpp" class MainMenuPage : public TempateMenuPage<5> { public: void handleEvent() override; };
HomePage.hpp qui définit la page utilisée dans la classe template
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include "MainMenuPage.hpp" void MainMenuPage::handleEvent() { getApplication().gotoPage<HomePage>(); }
HomePage.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "Page.hpp" class HomePage : public Page { public: void handleEvent() override; };
Et enfin, l'erreur magique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include "HomePage.hpp" void HomePage::handleEvent() { }
Qu'en pensez-vous ?g++ -std=c++11 "-IC:\\Users\\X-pigradot\\workspaceTests\\Experiences\\src" "-IC:\\Users\\X-pigradot\\workspaceTests\\Experiences" -O0 -g3 -pedantic -Wall -Wextra -c -fmessage-length=0 -o "src\\MainMenuPage.o" "..\\src\\MainMenuPage.cpp" In file included from ..\src\MainMenuPage.hpp:1:0, from ..\src\MainMenuPage.cpp:1: ..\src\TempateMenuPage.hpp: In member function 'void TempateMenuPage<itemCount>::handleEvent()': ..\src\TempateMenuPage.hpp:10:43: error: expected primary-expression before '>' token getApplication().gotoPage<HomePage>(); ^ ..\src\TempateMenuPage.hpp:10:45: error: expected primary-expression before ')' token getApplication().gotoPage<HomePage>();
Merci d'avance !
Partager