我正在尝试创建一个struct timeout
。我想直接使用它。 std::this_thread::sleep_for(timeout)
。但是,由于某些我无法理解的原因,从struct timeout
到std::chrono::duration<rep,period>
转换时,我的用户定义转换失败。
这是完整的代码示例:
#include <chrono>
#include <thread>
template <typename Duration = std::chrono::milliseconds>
struct timeout_tp
{
using Duration_ = Duration;
using rep_ = typename Duration_::rep;
using period_ = typename Duration_::period;
timeout_tp(const rep_ &timeout) : timeout{timeout} {}
operator Duration_() const {return timeout;}
Duration_ operator()() const {return timeout;}
//...
private:
Duration_ timeout;
};
int main()
{
timeout_tp<std::chrono::seconds> timeout{1};
std::chrono::seconds x = timeout; //OK: struct timeout conversion to std::chrono::seconds.
std::this_thread::sleep_for(x);
//std::this_thread::sleep_for(timeout); : FAILS!!! Can't understand why...
std::this_thread::sleep_for(timeout()); //OK : struct timeout operator() returns std::chrono::seconds.
return 0;
}
我在做什么错了?
我需要做什么才能使用所需的语法?
编译器发出的错误消息:
main.cpp:38:39:错误:没有匹配的函数可以调用“ sleep_for(timeout_tp <>&)” std :: this_thread :: sleep_for(timeout); //失败!!!不明白为什么... ^
在main.cpp包含的文件中:16:0: / usr / include / c ++ / 7 / thread:361:7:注意:候选:模板无效std :: this_thread :: sleep_for(const std :: chrono :: duration <_Rep1,_Period1>&) sleep_for(const chrono :: duration <_Rep,_Period>&__rtime) ^ ~~~~~~~~~ / usr / include / c ++ / 7 / thread:361:7:注意:模板参数推导/替换失败:
main.cpp:38:39:注意:“ timeout_tp <>”并非源自“ const std :: chrono :: duration <_Rep1,_Period1>” std :: this_thread :: sleep_for(timeout); //失败!!!不明白为什么...
答案 0 :(得分:1)
::std::this_thread::sleep_for
是一个声明为
template< class Rep, class Period >
void sleep_for( const std::chrono::duration<Rep, Period> & sleep_duration );
当您传递timeout_tp
模板参数Rep
和Period
的实例时,不能定义用户定义的转换运算符timeout_tp
到std::chrono::milliseconds
的情况。甚至考虑在内。