C++升压测试无法测试操作员<

C++ boost test can't test operator <

本文关键字:测试 lt 操作员 C++      更新时间:2023-10-16

我在使用 Boost C++ 单元测试框架时遇到问题。 这是文件 someclass.h

class someclass {
   public:
      someclass(int a_x, int b_x);
      someclass();
      friend bool operator<(someclass& lhs, someclass& rhs);
      friend ostream& operator<<(ostream& stream, const someclass& sa);
   private:
      int a;
      int b;
};

这是某个类的文件.cpp

#include <iostream>
#include <ostream>
#include <vector>
#include <tuple>
using std::cout;
using std::endl;
using std::vector;
using std::ostream;
#include "someclass.h"
someclass::someclass(int a_x, int b_x)
:a(a_x), b(b_x)
{
}
//-------------------------------------------------------
someclass::someclass()
{
}
//-------------------------------------------------------
bool operator<(someclass& lhs, someclass& rhs)
{
   return std::tie(lhs.a, lhs.b) < std::tie(rhs.a, rhs.b);
}
//-------------------------------------------------------
ostream& operator<<(ostream& stream, const someclass& rhs)
{
   stream << "(" << rhs.a << "," << rhs.b << ")";
   return stream;
}

这是测试它的程序:

#define BOOST_TEST_MODULE test_someclass
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
#include <ostream>
using std::ostream;
#include "someclass.h"
BOOST_AUTO_TEST_CASE( someclass_lt )
{
   someclass sa1(1,4);
   someclass sa2(1,5);
   someclass sa3(2,3);
   someclass sa4(2,4);
   someclass sa5(2,5);
   BOOST_TEST( sa1 < sa2 );
   BOOST_TEST( !(sa2 < sa1) );
   BOOST_TEST( sa1 < sa3 );
   BOOST_TEST( sa1 < sa4 );
   BOOST_TEST( sa1 < sa5 );
}

该文件 someclass.cpp 本身编译得很好,但是当我尝试编译整个事情在一起,我得到了一大组错误消息,其中部分内容是,

In file included from testsomeclass.cpp:9:0:
someclass.h:6:19: note: bool operator<(someclass&, someclass&)
       friend bool operator<(someclass& lhs, someclass& rhs);
                   ^
someclass.h:6:19: note:   no known conversion for argument 1 from ‘someclass’ to ‘someclass&’

我已经尝试了我能想到的一切方法来纠正这一点,但无济于事。我也在 stackoverflow.com 和许多其他网站上搜索过,但无济于事。有人可以告诉我出了什么问题以及如何解决它吗? 谢谢。

布鲁斯

你应该使用正确的恒常性:

friend bool operator<(const someclass& lhs, const someclass& rhs);