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。