0

私はCppUnitライブラリを使い始めました。そして、すべてが正常に機能しましたが、今では、を使用してイテレータをアサートすることに固執していますCPPUNIT_ASSERT_EQUAL。だから私のコードがあります:

void TestingClass::test_adjacent_find()
{
    // Set up
    int a [5] = {1,2,3,3,5};
    int b [5] = {1,2,3,4,5};
    int c [1] = {1};

    std::list<int> lst;
    lst.push_back(1);
    lst.push_back(1);
    lst.push_back(5);

    // Check
    CPPUNIT_ASSERT_EQUAL(a+2, my_adjacent_find(a , a+5, pred_eq<int>));
    CPPUNIT_ASSERT_EQUAL(b+5, my_adjacent_find(b, b+5, pred_eq<int>));
    CPPUNIT_ASSERT_EQUAL(c+1, my_adjacent_find(c, c+1, pred_eq<int>));
    CPPUNIT_ASSERT_EQUAL(lst.begin(), lst.end()); // problem is here
}

このテストを実行すると、以下のエラーが発生します。

/opt/local/include/cppunit/TestAssert.h:49:13: 
Invalid operands to binary expression 
('OStringStream' (aka 'basic_ostringstream<char>') 
and 'const std::_List_iterator<int>')

この行をイテレータでコメントすると、問題なくコンパイルされます。だから私は何が間違っているのですか?そして、2つのイテレータの同等性をどのように主張する必要がありますか?ちなみに、私はxcode4.4を使用しています。

4

1 に答える 1

3

CPPUNIT_ASSERT_EQUALのマクロドキュメントを参照してくださいTestAssert.h

#define CPPUNIT_ASSERT_EQUAL(expected,actual)

expectedactualパラメータの要件:

  • それらはまったく同じタイプです
  • それらは、演算子<<を使用してstd::strstreamにシリアル化できます。
  • それらは、演算子==を使用して比較できます。

最後の2つの要件(シリアル化と比較)は、を特殊化することで削除できますCppUnit::assertion_traits

したがって、問題の根本的な原因は、std::list::iteratorにシリアル化できなかったことstd::strstreamです。ドキュメントで説明されているように、独自のCppUnit::assertion_traits専門分野を作成するか、単に回避CPPUNIT_ASSERT_EQUALして使用する必要がありCPPUNIT_ASSERTます。

CPPUNIT_ASSERT(lst.begin() == lst.end());
于 2012-09-14T13:37:35.783 に答える