operator <

问题描述 投票:-1回答:1

我正在为我的c ++项目使用Catch2。我为几个类编写了一个operator <

这对我自己的自定义类来说很好用。例如对于我的货币类,我有这个运算符<

std::ostream& operator<< (std::ostream& os, const Money& value);

我正在尝试为std :: chrono :: system_clock :: time_point类型的运算符写一个运气,但是没有运气。我的意思是,它确实可以毫无错误地进行编译,但是Catch2没有使用它。为什么?

这意味着我的测试将打印如下内容:

utility/test/Date.test.cpp:83: FAILED:
  REQUIRE( actual == expected )
with expansion:
  {?} == {?}

而不是像这样的东西:

utility/test/Date.test.cpp:83: FAILED:
  REQUIRE( actual == expected )
with expansion:
  TP2343234 == TP2343234

有趣的是,在同一test.cpp文件中的std :: cout上下文中,调用了time_point的运算符。

我的完整实现是这样的:

std::ostream& operator<< (std::ostream& os, const std::chrono::system_clock::time_point& value )
{
    os << value.time_since_epoch().count();
    return os;
}

测试用例是这样:

SECTION("Convert Date to std::chrono::system_clock::time_point")
{
    auto one_day = std::chrono::duration<int, std::ratio<60*60*24>>(1);
    std::chrono::system_clock::time_point epoch_plus_one_day = std::chrono::system_clock::time_point{} + one_day;
    auto t = Date(1970, 1, 2).to_time_point();
    std::cout << "std::chrono::system_clock::time_point{} " << epoch_plus_one_day.time_since_epoch().count() << std::endl;
    std::cout << "t                                       " << t.time_since_epoch().count() << std::endl;
    REQUIRE(t == epoch_plus_one_day);
}

将产生以下输出:

std::chrono::system_clock::time_point{} 86400000000000
t                                       86400000000000
-------------------------------------------------------------------------------
Date object
  Convert Date to std::chrono::system_clock::time_point
-------------------------------------------------------------------------------
Utility/test/Date.test.cpp:52
...............................................................................

utility/test/Date.test.cpp:61: PASSED:
  REQUIRE( t == epoch_plus_one_day )
with expansion:
  {?} == {?}                  // <- this should've printed "86400000000000 == 86400000000000".
c++ chrono catch2
1个回答
0
投票

您的自定义operator<<使用ADL(依赖于参数的查找)进行查找。如果您使用的名称空间不同于为operator<<定义的名称空间,则ADL将找不到它。您可以使用以下方法将其纳入范围:

using other::operator<<;

这里是一个免费的,仅开放源代码的标头库,它针对system_clock::time_pointhttps://github.com/HowardHinnant/date/blob/master/include/date/date.h完全做到这一点>

示例用法:

#include "date/date.h"
#include <iostream>

int
main()
{
    using date::operator<<;
    std::cout << std::chrono::system_clock::now() << '\n';
}

示例输出:

2020-03-17 21:43:18.020096
© www.soinside.com 2019 - 2024. All rights reserved.