Ce billet sera évolutif. Il regroupe des messages d'erreur relatifs à l'usage de wxWidgets. Les messages seront complètement libellés, donc facilement trouvables par le moteur de recherche de ce site.
"error C2509: 'GetEventTable' : member function not declared in 'wxDerivedFrame'" Réponse : il faut ajouter DECLARE_EVENT_TABLE() dans la classe de votre frame (voir fichier H)
"Instruction illégale" (Linux) Réponse : dans wxString::Format("%s", Buffer.c_str()), il ne faut pas oublier c_str() car GCC ne comprend pas.
"Can't add image to image list" Réponse : ne pas oublier de spécifier la dimension des images lors de la création de la liste "new wxImageList(16,16)"
"Mon programme plante anormalement sur une action très précise" Réponse : si vous faites un wxDELETE sur un pointeur, il faut s'assurer que celui-ci a été initialisé à NULL au début de la fonction. Exemple: wxString *Buffer = NULL;
"No handler found for image type" Réponse : il faut appeler wxInitAllImageHandlers() dans OnInit de votre application
"Unable to open requested HTML document" Réponse : dans OnInit de votre application, il faut appeler wxFileSystem::AddHandler(new wxInternetFSHandler) et déclarer #include "wx/fs_inet.h"
"error C2485: 'deprecated' : unrecognized extended attribute" Réponse : si votre compilateur est trop vieux, commenter juste avant "__declspec" pour tuer la macro
"Mon wxFile lit que de la merde" Réponse : si votre tampon rempli de wxChar doit subit l'objet de calculs sur la valeur de l'octet, il faut plutôt le définir comme rempli de "unsigned char"
"missing ';' before 'PCH creation point'" Réponse : dans le fichier H problématique, ajouter un ";" juste avant le #endif final
"error LNK2001: unresolved external symbol "protected: virtual class wxEventHashTable..." Réponse : vous avez utilisé DECLARE_EVENT_TABLE() sans avoir d'événement à gérer. Effacez cette macro ainsi que les fichiers précompilés grâce à "Build>Clean".
"fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786)" Réponse : bien que documenté, ce bug se pallie en n'oubliant pas de mettre () dans le destructeur de votre classe, à savoir "MyClass::~MyClass() {}"
"error LNK2001: unresolved external symbol "public: virtual class wxClassInfo __thiscall*" Réponse : vous ne devez probablement pas avoir le droit d'utiliser la macro DECLARE_CLASS
"error C2144: syntax error : missing ';' before type 'short'" Réponse : vous avez ajouté par inadvertance un caractère en dehors de votre code C++, sûrement à la suite d'un Ctrl ou Alt trop rapide. Vérifiez au début
"error C2512: 'wxMyClass' : no appropriate default constructor available" Réponse : vous devez malgré tout créer un constructeur avec paramètre vide comme "MyClass():Var1(1),Var2(2) {}" si vous voulez charger un constructeur avec "MaClass(int a, int b):Var1(a),Var2(b) {}". Ou alors, définissez des valeurs par défaut dans le constructeur chargé, comme dans "MaClass(int a = 1, int b = 2):Var1(a),Var2(b) {}" sans rien d'autre
"error C2143: syntax error : missing ';' before ''*" Réponse : dans un fichier C++ unique, vous déclarez dans une classe une classe définie plus bas. Inversez l'ordre d'apparition de ces classes, ou déclarez neutre "class MyClass;" si elle est définie plus tard.
"Les tabulations ne fonctionnent pas" Réponse : ajoutez le style "wxTAB_TRAVERSAL" dans le constructeur de votre frame.
"error C2015: too many characters in constant" Réponse : quand vous déclarez une chaîne en tant que tableau de caractères, il faut faire "char var[3] = {'A', 'B', 'C'};"
"J'ai dû mal à gérer mes entêtes wxHTTP" Réponse : vous devez utiliser wxHTTP::SetHeader --après-- vous être connecté avec wxHTTP::Connect.
"Le centrage de mes fenêtres avec wxFrame::Center() est hasardeux" Réponse : si le paramètre "Parent" est fourni dans le constructeur de votre fenêtre, le centrage sera fait par rapport à la fenêtre parente. Si le parent est désigné NULL, votre fenêtre sera centrée par rapport à l'écran. Il est conseillé de passer le paramètre Parent normalement pour faire tenir les fenêtres dans un espace minimal.
"Mon logiciel plante lorsque j'essaie d'attribuer un texte à un composant." Réponse : Si vous utilisez wxString::Format(), veillez à ne pas utiliser un joker "%s" pour encoder un chiffre. Il faut utiliser plutôt %d. C'est un détail fort discret.
"Error C2236: unexpected 'class'" Réponse : vérifiez dans vos fichiers .H que vos classes contiennent un point-virgule après les accolades fermantes. Exemple: wxClassePerso{ public : /.../ };
"error C2629: unexpected 'class XYZ ('" Réponse : dans le constructeur de votre classe, vous utilisez un paramètre dont la classe n'a pas été déclarée via un #include.
"error C2064: term does not evaluate to a function" Réponse : ne mettez pas de () derrière une variable de classe. Ce n'est pas une fonction !
"error C2065: 'wxMyClass' : undeclared identifier" Réponse : si tout paraît OK, vérifier au niveau du fichier H qu'il n'y a pas de confusion avec un autre fichier H avec #ifndef et #define.
"error C2182: 'MyClass' : illegal use of type 'void'" Réponse : n'oubliez pas que "void MyClass::Function[...]" prend deux ":".
"error C2243: 'type cast' : conversion from 'class MyClass ' to 'class wxWindow ' exists, but is inaccessible" Réponse : n'omettez pas "public" dans la définition de votre classe. Exemple: "class MyClass : public wxWindow"
"error C2027: use of undefined type 'wxSubClass'" Réponse : la lecture d'un fichier .H étant verticale, vous ne pouvez pas appeller les méthodes des classes déclarés plus tard. Pour outrepasser le message d'erreur, vous devez coder le C++ dans les fichiers .CPP et vous servir des fichiers *.H pour faire uniquement vos déclarations.
"error C2501: 'wxMyClass' : missing storage-class or type specifiers" Réponse : ce message poisseux se produit lorsque des classes non totalement définies se déclarent mutuellement. Et ça, le compilateur n'aime pas du tout ! Dans ce cas, pour contrer la lecture verticale des entêtes, il faut utiliser l'artifice "class wxMyClass;" pour signaler que la classe existe mais sera définie plus tard. Il faut aussi parfois déplacer certains #include vers la fin de certains fichiers *.H. C'est du cas par cas, mais les idées sont là.
"error C2259: 'wxMyClass' : cannot instantiate abstract class due to following members" Réponse : vous avez dérivé une classe abstraite sans redéfinir les fonctions virtuelles pures de celle-ci. Ces fonctions sont détaillées par les erreurs C4259. Vous devez les réécrire toutes dans votre classe dérivée (quitte à les rendre vides et/ou à redéfinir leur portée).
"error C2084: function 'void __thiscall wxMyClass::Function(...)' already has a body" Réponse : dans le fichier .H, remplacez "{}" par ";" à la fin de la déclaration de la fonction citée. Ou relocalisez le code dans le fichier .CPP.
"error C2253: 'Funtion' : pure specifier only applies to virtual function - specifier ignored" Réponse : pour déclarer une fonction abstraite, vous devez d'abord la rendre virtuelle, puis la mettre à zéro pour la marquer abstraite. Cela nous fait donc par exemple : class wxMyClass { protected: virtual something() = 0; };
"fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'E:\8168\vc98\p2\src\P2\main.c', line 494)" Réponse : fractionnez votre ligne de code en passant par des variables intermédiaire.
"error C2668: 'Function' : ambiguous call to overloaded function" Réponse : dans votre classe, il existe une fonction ayant au moins 2 déclarations différentes. Le compilateur appellera celle qui convient grâce au type de vos paramètres. L'erreur vous incite à force le type avec un cast. Exemple: function((MyType*)NULL);
"External link not resolved with .H file" Réponse : pour pouvoir utiliser le mot-clé INLINE, vous devez codez la fonction dans le fichier H et non CPP.
"warning C4091: '' : ignored on left of 'unsigned int' when no variable is declared" Réponse : vous avez transformé une constante #define en variable globale. Votre projet doit être nettoyé et recompilé.