2013-03-05 10 views
6

と1.53ローカルの日付時刻のコンパイラエラーを私は-std = C++ 0xの私は、以下を取得して、次のブースト-std = C++ 0xの

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

をコンパイルしようとすると、G ++バージョン4.7.2を使用してエラー。

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オプションをオフにしても、すべて問題ありません。 誰でもここで何が起こっているか教えていただけますか?

答えて

12

C++ 11用にビルドする場合、boost::shared_ptr::operator bool()explicitと宣言されています。これは、一般的に行うには良いことですが、残念ながらそれは、そのような(あなたのエラーの原因である)、この関数として暗黙的な変換に依存しているコードを破る:dst_calc_rules_shared_ptrある

virtual bool has_dst() const 
{ 
    return (dst_calc_rules_); //if calc_rule is set the tz has dst 
} 

  • ハックreturn bool(dst_calc_rules_);
  • に機能暗黙的な変換を可能にしBOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORSを定義します。

    ブーストで誰かがそれを固定にラウンドされるまで

    、あなたができる2つのものがあります。
+0

ありがとうございました。 – Craig

+4

[1.53リリースノート](http://www.boost.org/users/history/version_1_53_0.html): 'スマートポインタは、C++ 11コンパイラで明示的な演算子boolを使用するようになりました。これは、ブールを取る関数へのスマートポインタを渡すコード、またはブール戻り型の関数からのスマートポインタを返すコードを破る可能性があります。この場合、p!= 0または!! pを使用してください。 ' –

+3

スマートポインタの変更は日付のバグを引き起こしましたか? – Craig