2013-03-05 29 views
6

Sử dụng g ++ phiên bản 4.7.2, nếu tôi cố gắng biên soạn như sauTăng 1,53 địa phương thời gian ngày biên dịch lỗi với -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; 
} 

với -std = C++ 0x tôi nhận được như sau lỗi.

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 

Nếu tôi thoát khỏi tùy chọn C++ 0x, mọi thứ đều ổn. Ai có thể cho tôi biết điều gì đang xảy ra ở đây?

Trả lời

12

Khi bạn xây dựng cho C++ 11, boost::shared_ptr::operator bool() được khai báo explicit. Điều này thường là một điều tốt để làm, nhưng tiếc là nó phá vỡ mã mà dựa vào chuyển đổi tiềm ẩn, chẳng hạn như chức năng này (đó là nguyên nhân gây ra lỗi của bạn):

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

nơi dst_calc_rules_ là một shared_ptr.

Cho đến khi một người nào đó ở Boost được vòng để sửa chữa nó, có hai điều bạn có thể làm:

  • Hack có chức năng return bool(dst_calc_rules_);
  • Xác định BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS để cho phép chuyển đổi tiềm ẩn.
+0

Cảm ơn bạn vì điều đó. – Craig

+4

Trong [ghi chú phát hành 1,53] (http://www.boost.org/users/history/version_1_53_0.html): 'Con trỏ thông minh giờ đây sử dụng toán tử toán tử rõ ràng trên trình biên dịch C++ 11. Điều này có thể phá vỡ mã mà chuyển một con trỏ thông minh đến một hàm lấy một bool hoặc trả về một con trỏ thông minh từ một hàm có kiểu trả về bool. Vui lòng sử dụng p! = 0 hoặc !! p trong các trường hợp như vậy. ' –

+3

Vì vậy, thay đổi đối với con trỏ thông minh có thời gian ngày bị lỗi? – Craig

Các vấn đề liên quan