使用g ++版本4.7.2,如果我尝试编译以下
#include <boost/date_time/local_time/local_time.hpp>
class Bar
{
public:
Bar() { tz_db_.load_from_file("/home/date_time_zonespec.csv"); }
private:
boost::local_time::tz_database tz_db_;
};
int main()
{
return 0;
}
with -std = c ++ 0x我收到以下错误。
In file included from /usr/local/include/boost/date_time/local_time/local_time_types.hpp:18:0,
from /usr/local/include/boost/date_time/local_time/local_time.hpp:13,
from test.h:4,
from test.cpp:1: /usr/local/include/boost/date_time/local_time/custom_time_zone.hpp: In instantiation of ‘bool boost::local_time::custom_time_zone_base<CharT>::has_dst() const [with CharT = char]’: test.cpp:11:1: required from here /usr/local/include/boost/date_time/local_time/custom_time_zone.hpp:67:30: error: cannot convert ‘const boost::shared_ptr<boost::date_time::dst_day_calc_rule<boost::gregorian::date>
>’ to ‘bool’ in return
如果我不使用c ++ 0x选项,一切都很好。 谁能告诉我这里发生了什么?
答案 0 :(得分:12)
为C ++ 11构建时,boost::shared_ptr::operator bool()
被声明为explicit
。这通常是一件好事,但遗憾的是它会破坏依赖于隐式转换的代码,例如此函数(这是导致错误的原因):
virtual bool has_dst() const
{
return (dst_calc_rules_); //if calc_rule is set the tz has dst
}
其中dst_calc_rules_
是shared_ptr
。
直到Boost的某个人开始修复它,你可以做两件事:
return bool(dst_calc_rules_);
BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
以允许隐式转换。