使用HippoMocks模拟boost::chrono::steady_clock::now编译失败求助
原业务代码
boost::system::error_code clock_error; const boost::chrono::steady_clock::time_point START = boost::chrono::steady_clock::now(clock_error);
测试模拟代码
boost::chrono::steady_clock::time_point start(boost::chrono::seconds(0)); boost::system::system_error clock_error(1, BOOST_CHRONO_SYSTEM_CATEGORY, "foo"); mocks.ExpectCallFuncOverload( (boost::chrono::steady_clock::time_point (boost::chrono::steady_clock::*) (boost::system::error_code& clock_error)) &boost::chrono::steady_clock::now) .With(Out(clock_error)) .Return(start);
编译错误信息
error: no matches converting function ‘now’ to type
‘boost::chrono::steady_clock::time_point (class
boost::chrono::steady_clock::)(class boost::system::error_code&) {aka
class boost::chrono::time_pointboost::chrono::steady_clock (class
boost::chrono::steady_clock::)(class boost::system::error_code&)}’
mocks.ExpectCallFuncOverload(In file included from ...
note: candidates are: static boost::chrono::steady_clock::time_point
boost::chrono::steady_clock::now(boost::system::error_code&)static BOOST_CHRONO_INLINE time_point now(system::error_code & ec); ^../../../KACotsCode/boost/boost/chrono/system_clocks.hpp:162:46: note:
static boost::chrono::steady_clock::time_point
boost::chrono::steady_clock::now()
static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;^
问题分析与解决
编译失败有两个核心问题:
1. 静态成员函数的指针类型错误
boost::chrono::steady_clock::now是静态成员函数,静态成员函数没有隐含的this指针,因此它的函数指针类型是普通函数指针,而非带类作用域的非静态成员函数指针格式。
你当前写的指针格式是针对非静态成员函数的:
boost::chrono::steady_clock::time_point (boost::chrono::steady_clock::*) (boost::system::error_code&)
静态成员函数的正确指针格式应该是:
boost::chrono::steady_clock::time_point (*)(boost::system::error_code&)
2. 参数类型不匹配
测试代码中你声明的clock_error是boost::system::system_error(异常类),但now()函数的参数要求是boost::system::error_code&(错误码类),两者类型不兼容,需要替换为正确的error_code类型。
修正后的测试代码
boost::chrono::steady_clock::time_point start(boost::chrono::seconds(0)); boost::system::error_code clock_error(1, BOOST_CHRONO_SYSTEM_CATEGORY); // 改用error_code类型 mocks.ExpectCallFuncOverload( // 修正静态成员函数的指针类型 (boost::chrono::steady_clock::time_point (*)(boost::system::error_code&))&boost::chrono::steady_clock::now ) .With(Out(clock_error)) .Return(start);
内容的提问来源于stack exchange,提问作者zephod

