错误 C2274:使用 auto 进行 boost::p osix_time::time_duration 时出现"函数样式转换"的原因是什么?
What's the reason of error C2274: 'function-style cast' when using auto for boost::posix_time::time_duration?
以下代码:
auto td = boost::posix_time::seconds(1);
auto seconds = td.seconds(); // (*)
std::cout << seconds << std::endl;
在cl16上给出以下错误:
error C2274: 'function-style cast': illegal作为'的右边。"操作符
在// (*)
.
当我把第一行改成:
boost::posix_time::time_duration td = boost::posix_time::seconds(1);
它编译得很好。
如果我理解正确,boost::posix_time::seconds(1)
返回这个类的一个实例:
class seconds : public time_duration
{
public:
explicit seconds(long s) :
time_duration(0,0,s)
{}
};
从<<p> (em>增加/date_time/posix_time/posix_time_duration.hpp 和time_duration
类公开的公共方法seconds
:
sec_type seconds() const
从<<p> (em>增加/date_time time_duration.hpp )。那么这里auto
的问题是什么?
第一次使用auto
将类型推断为boost::posix_time::seconds
,而不是boost::posix_time::time_duration
。在类型seconds
中,seconds
引用类型/构造函数,编译器不再能够找到您想要调用的继承的(现在隐藏的)函数。
我要用你已经想到的:你可以将td
声明为boost::posix_time::time_duration
。
(我不完全确定标准在这里说了什么——它可能允许,也可能不允许。我只关注你的编译器允许什么