1

プログラム内のクラスをテストするために CPPUnit を使用しています。このクラス ( SCriterionVal) は、多くの型の変換演算子を持っているため、ややユニークです (これは本質的に動的型値クラスです)。を使用してテストするテスト ケースをコンパイルすると、CPPUnit ヘッダー ファイルの 1 つから「あいまいです」CPPUNIT_ASSERT_EQUAL()というコンパイル エラーが発生します。私の型で構造体をoperator<<インスタンス化しているようで、その構造体には を使用して動作するメソッドがあります。assertion_traitstoString()operator<<OStringStream

SCriterionValで利用可能なさまざまな変換があり、その一部が定義さoperator<<れているため (組み込み型など) 、エラーではなくあいまいであると思います。SCriterionValこの状況を修正するために、次のシグネチャを使用してヘッダーに非メンバー関数を作成しました。

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

署名は完全に一致する必要があるため、あいまいさが解決されると考えました。そのような幸運はありません。ここで何が間違っていますか?テンプレートを自分のタイプに特化できると思いますがassertion_traits、テスト フレームワークに対応するだけでなく、自分のクラスをストリームに入れる方法を提供するという、より一般的な問題を解決できることを望んでいました。

4

1 に答える 1

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;
  }
于 2009-09-22T18:52:33.270 に答える