1

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

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

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

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

4

1 回答 1

2

尝试operator<<在类定义中定义为友元内联函数。我总是发现这种方式效果最好,尤其是对于模板。

例如,Boost.Random 定义operator<<insideexponential 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;
  }
于 2009-09-22T18:52:33.270 回答