重载运算符<<用于ostream

时间:2009-09-22 18:33:36

标签: c++ operator-overloading cppunit

我正在使用CPPUnit来测试我的程序中的一个类。这个类(SCriterionVal)有点独特,因为它有很多类型的转换运算符(它本质上是一个动态类型值类)。当我编译使用CPPUNIT_ASSERT_EQUAL()测试它的测试用例时,我从其中一个CPPUnit头文件中得到关于“operator<<不明确”的编译错误。它似乎是用我的类型实例化assertion_traits结构,并且该结构有一个toString()方法,可以在operator<<上使用OStringStream

我认为这是不明确的,而不是错误,因为SCriterionVal上可用的各种转换,其中一些已定义operator<<(例如内置类型)。为了纠正这种情况,我使用此签名在SCriterionVal的标题中创建了一个非成员函数:

ostream &operator<<(ostream &stream, SCriterionVal val);

我认为因为签名应该是完全匹配,它将解决歧义。没有这样的运气。我在这做错了什么?我想我可以为我的类型专门设置assertion_traits的模板,但我希望能够解决更普遍的问题,提供一种方法将我的类放入流中,而不仅仅是迎合测试框架

1 个答案:

答案 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;
  }
相关问题