2014-06-15 69 views
1

下面一段代碼:什麼錯誤C2274的原因是什麼?

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

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

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

給出CL 16以下錯誤:

錯誤C2274: '功能樣式轉換':作爲右側非法'。運營商

標記爲// (*)的行上。

當我改變的第一行:

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

(從升壓/ DATE_TIME /了posix_time/posix_time_duration.hpp

time_duration類公開公共方法seconds

sec_type seconds() const 

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

那麼,什麼是與auto這裏的問題?

回答

1

auto的第一次使用推斷類型爲boost::posix_time::seconds,而不是boost::posix_time::time_duration。在類型secondsseconds指型/構造函數,編譯器不再能夠找到繼承的,現在隱藏,功能,您打算調用。

我會用你已經知道的:你可以聲明tdboost::posix_time::time_duration

(我不完全確定這裏的標準是什麼 - 它可能允許也可能不允許,我只關注你的編譯器允許的內容。)

相關問題