错误 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?

本文关键字:time 样式 函数 转换 是什么 duration 进行 auto 使用 C2274 boost      更新时间:2023-10-16

以下代码:

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

(我不完全确定标准在这里说了什么——它可能允许,也可能不允许。我只关注你的编译器允许什么