错误C2274的原因是什么:'功能式演员'当使用auto进行boost :: posix_time :: time_duration时?

时间:2014-06-15 11:39:10

标签: c++ auto

以下代码:

auto td = boost::posix_time::seconds(1);

auto seconds = td.seconds(); // (*)

std::cout << seconds << std::endl;

在CL 16上给出以下错误:

  

错误C2274:'function-style cast':非法作为'。'的右侧。操作

在标有// (*)

的行上

当我将第一行更改为:

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)
  {}
};

(来自 boost / date_time / posix_time / posix_time_duration.hpp

time_duration类公开了公共方法seconds

sec_type seconds() const

(来自 boost / date_time / time_duration.hpp )。

那么auto的问题是什么?

1 个答案:

答案 0 :(得分:1)

首次使用auto会将类型推断为boost::posix_time::seconds,而不是boost::posix_time::time_duration。在类型seconds中,seconds引用类型/构造函数,并且编译器不再能够找到您要调用的继承的,现在隐藏的函数。

我选择您已经想到的内容:您可以将td声明为boost::posix_time::time_duration

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