tinybind編譯和運行

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的鏈接:

    https://github.com/diziqian/tinyBind

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章