0

我有一个提升递归变体,如下所示。当我使用断言比较两个递归变体对象时,它工作正常,但使用 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: error: no match for 'operator<<' in '((const boost::detail::variant::printer > >*)this )->boost::detail::variant::printer >>::out_ <<操作数'</p>

4

1 回答 1

1

gtest 大量使用流进行输出,但似乎 boost::variant 对通过重载 operator<< 打印的支持非常有限,如果不是不存在的话。

看看这个:

#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 回答