C++11 无法将std::chrono::duration与零进行比较
在我正在处理的模板类中,我想检查一个先决条件,即C++11 无法将std::chrono::duration与零进行比较,c++11,chrono,C++11,Chrono,在我正在处理的模板类中,我想检查一个先决条件,即std::chrono::duration为正,但我的编译器抱怨它无法实例化所需的运算符尝试使用Interval::zero()。是一个函数,因此您要将持续时间与函数进行比较 作为旁注,我建议将构造函数中的间隔参数设置为模板,以便您可以接受其他duragion刻度(秒、毫秒、us等) 模板 显式容器(const Interval2 interval_u2;): 间隔(间隔),, 值(0) { 断言(Interval2::zero(); } std
std::chrono::duration
为正,但我的编译器抱怨它无法实例化所需的运算符尝试使用Interval::zero()
。是一个函数,因此您要将持续时间与函数进行比较
作为旁注,我建议将构造函数中的间隔参数设置为模板,以便您可以接受其他duragion刻度(秒、毫秒、us等)
模板
显式容器(const Interval2 interval_u2;):
间隔(间隔),,
值(0)
{
断言(Interval2::zero();
}
std::chrono::duration
构造函数将根据Period
参数类型透明地调整滴答数。“我建议将构造函数中的Interval参数设置为模板”:我确实要这样做。这只是第一个阶段。模板化构造函数比这更复杂。如上所示的代码表示,任何类型都将隐式转换为容器
。不仅仅是std::chrono::duration
s。如果OP想要处理的最精确的精度是秒
,那么他的原始构造函数将允许从分钟
和小时
进行转换。你是对的。首先,我没有添加显式的。模板参数是非常幼稚的。虽然操作符
#include <chrono>
#include <cassert>
#undef NDEBUG
template< typename VALUE >
class Container final
{
public:
using Interval = std::chrono::duration< unsigned int >;
Container(const Interval interval_):
interval(interval_),
value(0)
{
assert(Interval::zero < interval_);
}
private:
Interval interval;
VALUE value;
};
template class Container< unsigned int >;
In file included from /usr/include/c++/6/cassert:44:0,
from main.cpp:2:
main.cpp: In constructor ‘Container<VALUE>::Container(Container<VALUE>::Interval)’:
main.cpp:15:29: error: no match for ‘operator<’ (operand types are ‘std::chrono::duration<unsigned int>()’ and ‘const Interval {aka const std::chrono::duration<unsigned int>}’)
assert(Interval::zero < interval_);
~~~~~~~~~~~~~~~^~~
In file included from main.cpp:1:0:
/usr/include/c++/6/chrono:668:7: note: candidate: template<class _Clock, class _Dur1, class _Dur2> constexpr bool std::chrono::operator<(const std::chrono::time_point<_Clock, _Duration1>&, const std::chrono::time_point<_Clock, _Duration2>&)
operator<(const time_point<_Clock, _Dur1>& __lhs,
^~~~~~~~
/usr/include/c++/6/chrono:668:7: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/6/cassert:44:0,
from main.cpp:2:
main.cpp:15:31: note: mismatched types ‘const std::chrono::time_point<_Clock, _Duration1>’ and ‘std::chrono::duration<unsigned int>()’
assert(Interval::zero < interval_);
^
In file included from main.cpp:1:0:
/usr/include/c++/6/chrono:489:7: note: candidate: template<class _Rep1, class _Period1, class _Rep2, class _Period2> constexpr bool std::chrono::operator<(const std::chrono::duration<_Rep1, _Period1>&, const std::chrono::duration<_Rep2, _Period2>&)
operator<(const duration<_Rep1, _Period1>& __lhs,
^~~~~~~~
/usr/include/c++/6/chrono:489:7: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/6/cassert:44:0,
from main.cpp:2:
main.cpp:15:31: note: mismatched types ‘const std::chrono::duration<_Rep1, _Period1>’ and ‘std::chrono::duration<unsigned int>()’
assert(Interval::zero < interval_);
template < typename Interval2 >
explicit Container(const Interval2 interval_):
interval(interval_),
value(0)
{
assert(Interval2::zero() < interval_);
}