Introduction
忘備録。
まだまだ知らないことが世の中にはたくさんあります。
rapidjson のクラスを使っている時、template 経由で rapidjson のクラス rapidjson::Document::ParseStream の template 関数を呼び出すとビルドエラーになってしまった。
面倒なのは、Visual C++ ではビルドに問題ないのに、GCC では無慈悲なエラー。
error: invalid operands of types ‘
’ and ‘int’ to binary ‘operator<’ 
上記は自宅で再現したエラーなので rapidjson を使っているときのエラーとは厳密には違うが、単純に下記のようなコードをビルドした結果。
1  | std::ifstream ifs(json_path);  | 
T は template の typename で rapidjson::Document を呼び出し元で指定しているが、これを GCC でビルドしたのが上記のエラー。
要するに、 template として認識できません、ということ。
なんでぇ?
How to resolve?
今回は ChatGPT に何度か質問して解決した次第。
ということでした。
template キーワードをこんな使い方をするなんて初めて知ったので調べてみた。
Stackoverflow にそのものの回答があった。
- .template (dot-template) construction usage [duplicate]
 - Where and why do I have to put the “template” and “typename” keywords?
 
要するに .tempate というのは、template 経由で template を呼び出すときに、それがテンプレート関数だという事を示す為につけるキーワードらしい。
ちなみに、もし変数 doc がポインタだった場合は
1  | doc->template ParseStream<rapidjson::kParseCommentsFlag>(isw);  | 
のようにすればいい。
さらにいえば、この問題が発生するのは GCC と Xcode。
Microsoft Visual C++ は無事。
変なところで柔軟なのが Microsoft。

