我正在使用CPPUnit来测试我的程序中的一个类。这个类(SCriterionVal
)有点独特,因为它有很多类型的转换运算符(它本质上是一个动态类型值类)。当我编译使用CPPUNIT_ASSERT_EQUAL()
测试它的测试用例时,我从其中一个CPPUnit头文件中得到关于“operator<<
不明确”的编译错误。它似乎是用我的类型实例化assertion_traits
结构,并且该结构有一个toString()
方法,可以在operator<<
上使用OStringStream
。
我认为这是不明确的,而不是错误,因为SCriterionVal
上可用的各种转换,其中一些已定义operator<<
(例如内置类型)。为了纠正这种情况,我使用此签名在SCriterionVal
的标题中创建了一个非成员函数:
ostream &operator<<(ostream &stream, SCriterionVal val);
我认为因为签名应该是完全匹配,它将解决歧义。没有这样的运气。我在这做错了什么?我想我可以为我的类型专门设置assertion_traits
的模板,但我希望能够解决更普遍的问题,提供一种方法将我的类放入流中,而不仅仅是迎合测试框架
答案 0 :(得分:2)
尝试将operator<<
定义为类定义中的朋友内联函数。我总觉得这种方式效果最好,尤其是模板。
例如,Boost.Random在operator<<
的声明中定义了exponential distribution
:
template<class CharT, class Traits>
friend std::basic_ostream<CharT,Traits>&
operator<<(std::basic_ostream<CharT,Traits>& os, const exponential_distribution& ed)
{
os << ed._lambda;
return os;
}