0

私は以下のようなブースト再帰バリアントを持っています。assertを使用して2つの再帰バリアントオブジェクトを比較すると、正常に機能しますが、EXPECT_EQを使用すると、コンパイルエラーが発生します。

typedef boost::make_recursive_variant<bool, boost::uint8_t, boost::uint32_t,
    boost::int32_t, double, std::string, boost::uuids::uuid>::type rvariant_type;

variant_type b1 = true;
rvariant_type b2 = true;

assert(b1 == b2);  //work fine

EXPECT_EQ(b1,b2); //gives compiler error.
EXPECT_EQ(boost::get<bool>(b1), boost::get<bool>(b2)); //works fine

boost / v1.46.1 / include / boost / Variant / detail / Variant_io.hpp:64:エラー:'operator <<' in'((const boost :: detail :: Variant :: printer >> *)thisに一致しません)-> boost :: detail :: Variant :: printer >> ::out_<<オペランド'</p>

4

1 に答える 1

1

gtestは出力にストリームを多用しますが、オーバーロードされた演算子<<を介した印刷のboost :: Variantサポートは、存在しない場合でも、非常に制限されているようです。

これを見てください:

#include <boost/variant.hpp>
#include <boost/cstdint.hpp>
#include <boost/uuid/uuid.hpp>
#include <iostream>
typedef boost::make_recursive_variant<bool, boost::uint8_t, boost::uint32_t,
    boost::int32_t, double, std::string, boost::uuids::uuid>::type rvariant_type;

int main() {
  rvariant_type v1 = true;
  std::cout << v1 << std::endl;
  return 0;
}

この非常に短いプログラムでは、gtestから取得したのと同じコンパイルエラーが発生します。

これでそれを補う:

std::ostream& operator<<(std::ostream& out, const rvariant_type& p) {
  return out << boost::get<bool>(p);
}

テストをコンパイルします。あなたの例も機能させることができるかどうかを見ていきます。

更新:上記の演算子<<を配置した後、コードに基づいてテストをコンパイルして正常に実行したので、演算子<<の欠如がまさにそれを引き起こしていました。

于 2011-03-28T11:08:32.130 に答える