Bonjour,
J'ai régulièrement des message d'erreur de compilation ambiguïté entre windows et word_2K::windows dans les fichiers de la bibliothèque C++
Comment puis je résoudre ces problème sans toucher au framework?![]()
Bonjour,
J'ai régulièrement des message d'erreur de compilation ambiguïté entre windows et word_2K::windows dans les fichiers de la bibliothèque C++
Comment puis je résoudre ces problème sans toucher au framework?![]()
Salut,
De la manière la plus simple qui soit: en bannissant toute utilisation de la directive using namespace (donc, concrêtement, de la directive using namespace word_2k, sans doute)dans ton code, et, principalement, dans les fichiers d'en-tête (car ce point particulier est à considérer comme une erreur monumentale).
Cela t'oblige, il est vrai, à utiliser systématiquement le terme word_2k::windows au lieu de windows, mais cela t'évitera tout risque d'ambiguité: windows s'appliquera à la classe qui ne vient pas de word_2k, et word_2k::windows s'appliquera... à lui-même![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Bonjour
Je retiens ton information
J'ai beaucoup de directive
mais pas -sous réserve de vérification..; en cours -
Code : Sélectionner tout - Visualiser dans une fenêtre à part using namespace std;
il y en a aussi dans le frameword ( des std)
Code : Sélectionner tout - Visualiser dans une fenêtre à part using namespace word_2k;
Bonjour
J'ai trouvé dans le framework
mais pas d'autres
Code : Sélectionner tout - Visualiser dans une fenêtre à part namespace Word_2k
Code : Sélectionner tout - Visualiser dans une fenêtre à part using namespace Word_2k;
Il faut, de manière générale, faire très attention aux directives using namespace...
Déjà, je ne suis pas partisan de leur utilisation dans les fichiers d'implémentation, car elles ont pour résultat de "casser" le but recherché par l'utilisation des espaces de noms:
En effet, les espaces de noms ont, justement, pour but de permettre que que chaque classe définie en leur sein soit identifiée de manière unique, et donc, au final, d'éviter les ambigüités lorsque, pour notre plus grand malheur, deux bibliothèques définissant une classe portant un nom identique, se retrouvent regroupé au sein d'un même fichier.
Lorsque tu utilise la directive using namespace, tu indique d'utiliser ce qui se trouve à l'intérieur de cet espace de noms exactement comme si cela se trouvait dans l'espace de noms global.
Si, du fait de la directive, tu te retrouve avec deux classes portant le même nom qui sont considérées comme se trouvant dans l'espace de noms globlal, tu te retrouve de nouveau face à l'ambigüité, et donc, face à l'obligation d'utiliser le nom "long".
De plus, si tu utilises cette directive dans un fichier d'en-tête, elle va se répandre comme une trainée de poudre par le jeu des inclusions en cascades: si elle se trouve dans le fichier A.h, qui est inclus dans B.h, qui est lui-même inclus dans C.h qui, enfin, est inclus dans C.cpp, la directive sera utilisée de manière invisible pour le lecteur du code de C.cpp...
Au final, je préfères bien souvent utiliser un alias d'espace de noms si, vraiment, le nom complet devient trop long à utiliser plutôt que la directive using namespace![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Bonjour,
J'ai donc retiré cette directive dans 55 fichiers....
Mais j'ai toujours le résultat précédent
3 erreurs de compilation windows::word_2k dans filectrl.hpp
6 erreurs de compilation id° dans comctrls.hpp
Bonjour
J'ai trouvé dans le code du driver word la directive:
qui était fait pour permettre de changer de version de word
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define WORDVER Word_2k
Cette requete n'accepte pas la forme
J'ai donc, à titre d'essai supprimé la directive.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define WORDVER Word_2k::Windows
Je suis revenu au 9 erreurs de compilation
J'ai réussi à générer sans les errur dans le framework en retirant le driver word de la liste des fichiers d'include
je copie le fichier pour illustrer le problème
le contre exemple reproduit les 9 erreurs de compilation dans le framework
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 /******************************************************************************* * NOM: WordReader.h * ROLE: Read a bloc of text with MS WORD API * HISTORIQUE: * 05/05/2001, yab, initial version *******************************************************************************/ #ifndef WORDREADER_H #define WORDREADER_H /*_____INCLUDE-FILES__________________________________________________________*/ #include "Event.h" #include "Analyse.h" #include "StrConv.h" #include "Word_2K_SRVR.h" #include "Word_2k.h" #include "Office_2k.h" #pragma link "Word_2K_SRVR" #define WORDVER Word_2k /*_____CLASS-DEFINITION_______________________________________________________*/ class CWReader { #define FIRST_PARAGRAPH_INDEX 1 #define TRUE 1 #define FALSE 0 #define WORD_BOLD_TRUE -1 #define WORD_BOLD_FALSE 0 #define WORD_ITALIC_TRUE -1 #define WORD_ITALIC_FALSE 0 #define WIDE_CHARACTER_BELL '\u0007' #define WIDE_CHARACTER_CARRIAGE_RETURN '\u000D' #define WIDE_CHARACTER_SPACE L" " #define WIDE_CHARACTER_BACK_SLASH_B L"\b" #define WIDE_CHARACTER_BACK_SLASH_F L"\f" #define WIDE_CHARACTER_BACK_SLASH_T L"\t" #define WIDE_CHARACTER_BACK_SLASH_V L"\v" enum CWordReaderMethods{ START_WORD_API, STOP_WORD_API, OPEN_DOCUMENT, CLOSE_DOCUMENT, INITIALIZE_POINT_BLOC, GO_NEXT_BLOC, READ_BLOC, GET_LAYOUT_BLOC }; private: TWordApplication * m_pWordApplication; TWordDocument * m_pWordDocument; WordDocumentPtr m_pCurrentDocument; bool m_bDocumentIsOpen; Paragraphs * m_pAllParagraphs; long m_lNumberOfParagraphs; long m_IndexOfCurrentParagraph; Paragraph * m_pCurrentParagraph; RangePtr m_pCurrentRange; std::wstring m_wsRangeText; public: CWReader* pWordReader; CWReader::CWReader(); CWReader::~CWReader(); erc StartWordApi(); erc StopWordApi(); erc OpenDocument(std::wstring wsFullPathName); erc CloseDocument(); erc InitializePointBloc(bool & bIsTextEmpty); erc GoNextBloc(bool & bIsEndOfText); erc ReadBloc(CBloc *pBloc); erc GetLayoutBloc(CLayout *pLayoutBloc); void RemoveLastBadCharacter(); void change_tofind_In_wstring_With_Space(std::wstring &wsString, std::wstring to_find); }; //--------------------------------------------------------------------------- /*_____GLOBAL-DEFINE__________________________________________________________*/ /*_____GLOBAL-TYPES___________________________________________________________*/ /*_____GLOBAL-DATA____________________________________________________________*/ /*_____GLOBAL-MACROS__________________________________________________________*/ /*_____GLOBAL-FUNCTIONS-PROTOTYPES____________________________________________*/ #endif /* WORDREADER_H */
Attention, il ne faut pas confondre namespace xxx { ... } et using namespace xxx; !
J'espère que tu n'as supprimé que les seconds...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Bonjour,
Oui effectivement j'ai retiré beaucoup d'using namespace std,mais aucun namespace xxx.
et je ne touche pas aux framework
Actuellement j'ai contourné ce pb en passant les déclarations qui posaient problême du h au cpp
Je met résolue pour ne pas encombrer le forum, mais ce n'est qu'un pis aller.![]()
Partager