我有一个提升递归变量,如下所示。当我使用assert比较两个递归变体对象时,它工作正常但是使用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:错误:不匹配'运算符&lt;&lt;'在'((const boost :: detail :: variant :: printer&gt ;&gt; *)this) - &gt; boost :: detail :: variant :: printer&gt; &gt; :: out_&lt;&lt;操作数”
答案 0 :(得分:1)
gtest大量使用流来输出,但似乎boost :: variant支持通过重载运算符进行打印&lt;&lt;非常有限,如果不是非光的话。
看看这个:
#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);
}
让我的测试编译,我会看看我是否也可以使你的例子工作。
更新:我刚刚编译并成功运行了一个基于您的代码的测试,在放上上面提到的运算符&lt;&lt;,因此缺少运算符&lt;&lt;正是造成它的原因。