1.背景
XML是一種極好的語言,可以對現實實際和項目進行合理描述。XML解析也有各種成熟的方案。C++是一種常用的語言,有成熟的XML解析工程用於C++。但XML直接轉C++的結構體,是一種不太好完成的事情。於是,各種搜資料,發現tinybind是一種比較好的XML與C++互相轉換的工具。
2.遇到的問題
下載tinybind有兩個地址:
1)https://github.com/tyt2y3/tinybind
2)https://liquidtelecom.dl.sourceforge.net/project/tinybind/tinybind/0.1/tinybind.tar.gz
但TinyBind遇到的問題是,長期沒人用了,現在已經荒廢了。
我用鏈接源2進行下載,然後,放進QT裏運行。
編譯時發現問題如下:
1)tinybind/tinybind.h:222: error: there are no arguments to 'params' that depend on a template parameter, so a declaration of 'params' must be available [-fpermissive]
這個需要把using IMemberHolder<T>::tag; 和 using IMemberHolder<T>::params; 放入子類,具體如下:
template<class T, class MT>
class FromXmlElement : public IMemberHolder<T>
{
using IMemberHolder<T>::tag;
using IMemberHolder<T>::params;
public:
IMemberValuePolicy<T, MT> * mvPolicy_;
...
};
...
template<class T, class MT>
class FromXmlChildElement : public IMemberHolder<T>
{
using IMemberHolder<T>::tag;
using IMemberHolder<T>::params;
public:
IMemberValuePolicy<T, MT> * mvPolicy_;
...
};
...
template<class T, class MT>
class FromXmlAttribute : public IMemberHolder<T>
{
using IMemberHolder<T>::tag;
using IMemberHolder<T>::params;
public:
IMemberValuePolicy<T, MT> * mvPolicy_;
};
2)error: specializing member '::GetTiXmlBinding<MyData>' requires 'template<>' syntax TiXmlBinding<MyData> const *
解決方法:
TiXmlBinding<MyData> const *GetTiXmlBinding<MyData>(MyData const &, Identity<MyData>)
改爲 TiXmlBinding<MyData> const *GetTiXmlBinding(MyData const &, Identity<MyData>)
3)在Linux上會有error: 'stricmp' was not declared in this scope,在Linux上,可以加一條語句:
#ifndef WIN32
#define stricmp strcasecmp
#endif
4)error: 'ConvertFromString' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
ConvertFromString( attributeValue, &mv );
解決方法:
把void ConvertFromString(char const * strIn, T * dataOut); 放到調用者的前面.
5)在Windows上,會出現 undefined reference to `char const* ConvertToString<char const*>(char const* const&)' 的錯誤,原因是程序上的這句話:
#ifdef WIN32
#undef TIXML_USE_STL
#else
#define TIXML_USE_STL
#endif
重新定義一下TIXML_USE_STL即可。我的做法是:
#ifdef WIN32
#undef TIXML_USE_STL
#define TIXML_USE_STL
#else
#define TIXML_USE_STL
#endif
3.參考的資料
感謝原來鏈接:
[1]https://blog.csdn.net/ontheroad530/article/details/50386952
[2]https://blog.csdn.net/ontheroad530/article/details/50404618
4.結論
使用之後,我發現該程序僅僅是讓XML與自己完成的C++的結構體進行對應,對於使用者來說,必須提供C++結構體和XML文件。
已經整理好的程序已經上傳至github的鏈接: