代码之家  ›  专栏  ›  技术社区  ›  rmeador

重载运算符<<与ostream一起使用

  •  1
  • rmeador  · 技术社区  · 15 年前

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

    我假设它是模糊的,而不是错误,因为在 女阴囊 ,其中一些已经定义 操作员<< (例如内置类型)。为了纠正这种情况,我在头中创建了一个非成员函数 评论家的 有此签名:

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

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   rlbond    15 年前

    尝试定义 operator<< 作为类定义内的友元内联函数。我总是发现这种方法最有效,尤其是对于模板。

    例如,boost.random定义 操作员<< 里面 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;
      }