RapidXML を使用していて良く分からないコンパイルエラーが発生したのでメモ.以下のコードをコンパイルしようとするとエラーが発生しました.
#include <iostream> #include <istream> #include <fstream> #include <string> #include <vector> #include "rapidxml/rapidxml.hpp" template < class CharT, class Traits = std::char_traits<CharT> > class xmlwrapper { public: typedef CharT char_type; typedef std::basic_string<CharT, Traits> string_type; void output(std::basic_istream<CharT, Traits>& in) { std::vector<CharT> v; while (1) { CharT tmp[65536]; in.read(tmp, sizeof(tmp)); if (in.gcount() <= 0) break; v.insert(v.end(), tmp, tmp + in.gcount()); } // これらだとコンパイル・エラーにならない. // rapidxml::xml_document<char> doc; // rapidxml::xml_document<> doc; rapidxml::xml_document<CharT> doc; doc.parse<0>(reinterpret_cast<CharT*>(&v.at(0))); typedef rapidxml::xml_node<CharT>* node_ptr; for (node_ptr pos = doc.first_node(); pos; pos = pos->next_sibling()) { std::cout << "[" << pos->name() << "]" << std::endl; } } }; int main(int argc, char* argv[]) { if (argc < 2) std::exit(-1); std::ifstream ifs(argv[1]); xmlwrapper<char> xml; xml.output(ifs); return 0; }
問題となっているのは,doc.parse<0>() の部分.コメントに書いたように,CharT とテンプレート・パラメータのままにしておかずに,明示的に char を指定するとコンパイルに成功しました.エラーメッセージは以下のような感じ.
$ g++ -I.. -Wall example_rapidxml.cpp example_rapidxml.cpp: In member function `void xmlwrapper<CharT, Traits>::output(std::basic_istream<_CharT, _Traits>&) [with CharT = char, Traits = std::char_traits<char>]': example_rapidxml.cpp:41: instantiated from here example_rapidxml.cpp:27: error: invalid use of member (did you forget the `&' ?)
$ g++-4 -I.. -Wall example_rapidxml.cpp example_rapidxml.cpp: In member function 'void xmlwrapper<CharT, Traits>::output(std::basic_istream<_CharT, _Traits>&) [with CharT = char, Traits = std::char_traits<char>]': example_rapidxml.cpp:41: instantiated from here example_rapidxml.cpp:27: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
gcc 3.x のエラーメッセージだと意味が良く分からなかったのですが,gcc 4.x のエラーメッセージを見ると,どうやら doc.parse<0>() の <0 の部分が <演算子として認識されている模様.
解決策が分からなかったので,しばらくは char 決め打ちで・・・