この capnp コードに問題があります:
struct Result(Success, Error) {
union {
success @0 :Success;
error @1 :Error;
}
}
次のように c++ ソースを作成してコンパイルしました。
capnp compile -oc++ test.capnp
g++ -o test.capnp.o test.capnp.c++ `pkg-config --cflags capnp` -std=c++11
そして、生成されたヘッダー ファイルの複数の場所で、この同じエラー (および SUCCESS ではなく ERROR と同じ) が発生しています。
error: type/value mismatch at argument 2 in template parameter list for ‘template<class Success, class Error> struct Result’
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
error: expected a type, got ‘true’
error: expected primary-expression before ‘>’ token
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
error: ‘::SUCCESS’ has not been declared
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
^
以下は、g++ が不平を言う定義の 1 つです。
template <typename Success, typename Error>
inline ::capnp::ReaderFor<Success> Result<Success, Error>::Reader::getSuccess() const {
KJ_IREQUIRE(which() == Result<Success, Error>::SUCCESS,
"Must check which() before get()ing a union member.");
return ::capnp::_::PointerHelpers<Success>::get(
_reader.getPointerField(0 * ::capnp::POINTERS));
}
g++ がこれを受け入れない理由が本当にわかりません...
capnproto 0.5.3 (最初にこの問題が発生したのは 0.5.2 で、それが役立つかどうかを確認するために更新されました) と g++ 4.9.2 を使用しています。