Introduction

忘備録。
まだまだ知らないことが世の中にはたくさんあります。

rapidjson のクラスを使っている時、template 経由で rapidjson のクラス rapidjson::Document::ParseStream の template 関数を呼び出すとビルドエラーになってしまった。
面倒なのは、Visual C++ ではビルドに問題ないのに、GCC では無慈悲なエラー。

error: invalid operands of types ‘’ and ‘int’ to binary ‘operator<’

上記は自宅で再現したエラーなので rapidjson を使っているときのエラーとは厳密には違うが、単純に下記のようなコードをビルドした結果。

1
2
3
4
std::ifstream ifs(json_path);
rapidjson::IStreamWrapper isw(ifs);
T doc;
doc.ParseStream<rapidjson::kParseCommentsFlag>(isw);

T は template の typename で rapidjson::Document を呼び出し元で指定しているが、これを GCC でビルドしたのが上記のエラー。
要するに、 template として認識できません、ということ。

なんでぇ?

How to resolve?

今回は ChatGPT に何度か質問して解決した次第。

exception

ということでした。

template キーワードをこんな使い方をするなんて初めて知ったので調べてみた。
Stackoverflow にそのものの回答があった。

要するに .tempate というのは、template 経由で template を呼び出すときに、それがテンプレート関数だという事を示す為につけるキーワードらしい。

ちなみに、もし変数 doc がポインタだった場合は

1
doc->template ParseStream<rapidjson::kParseCommentsFlag>(isw);

のようにすればいい。
さらにいえば、この問題が発生するのは GCC と Xcode。
Microsoft Visual C++ は無事。
変なところで柔軟なのが Microsoft。