以下代码:
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
的问题是什么?
答案 0 :(得分:1)
首次使用auto
会将类型推断为boost::posix_time::seconds
,而不是boost::posix_time::time_duration
。在类型seconds
中,seconds
引用类型/构造函数,并且编译器不再能够找到您要调用的继承的,现在隐藏的函数。
我选择您已经想到的内容:您可以将td
声明为boost::posix_time::time_duration
。
(我不完全确定标准在这里说了什么 - 它可能会也可能不会允许它。我只关注你的编译器允许的内容。)