6

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

-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 オプションを省略しても問題ありません。ここで何が起こっているのか誰か教えてもらえますか?

4

1 に答える 1

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 の誰かが修正に取りかかるまで、できることは 2 つあります。

  • その機能をハックしてreturn bool(dst_calc_rules_);
  • BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS暗黙的な変換を許可するように定義します。
于 2013-03-05T21:45:22.023 に答える