Bonjour,
j'ai un petit problème de conception... Je suis entrain de lire/ecrire un fichier XML et j'aimerais faciliter mon travail en créant une structure pouvant associer un tag (string) avec un pointeur sur une variable!
Je me suis dit que ne connaissant pas le type de variable je pouvais utiliser
les templates, mais visiblement ça ne marche pas bien... j'ai l'erreur de compilation suivante:
Alors voici ma classe: VarLinkedToXmlTag.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 C:/wxWidgets-2.8.8/include/wx/window.h:(.text+0x0): multiple definition of `VarLinkedToXmlTag<long>::tmpString2Val(wxString const&)' main.o:C:/wxWidgets-2.8.8/include/wx/app.h:(.text+0x0): first defined here gui\ConfigXMLS400.o: In function `ZN17VarLinkedToXmlTagIdE13tmpString2ValERK8wxString': D:/projects/vicia/Debug/../gui/VarLinkedToXmlTag.hpp:82: multiple definition of `VarLinkedToXmlTag<double>::tmpString2Val(wxString const&)' main.o:D:/projects/vicia/Debug/../gui/VarLinkedToXmlTag.hpp:82: first defined here gui\ConfigXMLS400.o: In function `ZN17VarLinkedToXmlTagI8wxStringE13tmpString2ValERKS0_': D:/projects/vicia/Debug/../gui/VarLinkedToXmlTag.hpp:86: multiple definition of `VarLinkedToXmlTag<wxString>::tmpString2Val(wxString const&)' main.o:D:/projects/vicia/Debug/../gui/VarLinkedToXmlTag.hpp:86: first defined here gui\ConfigXMLPanel.o: In function `ZN12wxWindowBase12SetSizeHintsEiiiiii':
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 enum { XML_CHILD = 1, XML_ATTRI, XML_VALUE, }; template <typename T> class VarLinkedToXmlTag { public: VarLinkedToXmlTag(const wxString& tag_, T *val_,const wxString& defaultVal_ , int type_); void readFromXml(wxXmlNode *node); void writeToXml(wxXmlNode *node); protected: T *val; const int type; const wxString defaultVal; const wxString tag; private: void tmpString2Val(const wxString &tmp); }; template <typename T> VarLinkedToXmlTag<T>::VarLinkedToXmlTag(const wxString& tag_, T *val_,const wxString& defaultVal_ , int type_) :tag(tag_),val(val_),defaultVal(defaultVal_),type(type_) { } template <typename T> void VarLinkedToXmlTag<T>::readFromXml(wxXmlNode *node) { wxString tmp; switch(type) { case XML_CHILD: return; break; case XML_ATTRI: tmp = node->GetPropVal(tag,defaultVal); break; case XML_VALUE: if(node->GetName() == tag) { tmp = node->GetNodeContent(); } break; } tmpString2Val(tmp); } template <typename T> void VarLinkedToXmlTag<T>::tmpString2Val(const wxString &tmp) { int val_adrr=(int)val; wxLogMessage(wxT("the linked value (0x%x) for %s tag is unknown"),val_adrr,tag); } //Specialisation for int value void VarLinkedToXmlTag<long>::tmpString2Val(const wxString &tmp) { tmp.ToLong(val); } void VarLinkedToXmlTag<double>::tmpString2Val(const wxString &tmp) { tmp.ToDouble(val); } void VarLinkedToXmlTag<wxString>::tmpString2Val(const wxString &tmp) { *val = tmp; }
Et voici l'appel a la function
bon j'utilise les wxWidget donc il faut pas faire attention aux macros _T() et au wxString ... ca reviens a utiliser qqc de similaire a std::string
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include "VarLinkedToXmlTag.hpp" ConfigXMLCam::ConfigXMLCam(wxXmlNode *node) { long thr_alpha; VarLinkedToXmlTag<long> *var1 = new VarLinkedToXmlTag<long>(_T("thr_alpha"),&thr_alpha,_T("10"),XML_ATTRI); var1->readFromXml(node); }
Partager