2014-11-05 13 views
8

Sau khi (cố gắng) nâng cấp dự án VS2012 để sử dụng tăng 1,57, tôi không còn biên dịch được nữa - rất nhiều thông báo lỗi xuất hiện từ boost/any_iterator.hpp (xem bên dưới) . Là một thử nghiệm, tôi đã tạo một dự án mới không chứa gì ngoài chức năng chính trống và #include "boost/any_iterator.hpp" và có cùng một bộ lỗi. Đây là mã mà nó phàn nàn về:Không thể biên dịch boost/any_iterator.hpp để tăng 1.57

// snippet from boost/any_iterator.hpp 

template< 
      class Value 
      , class Traversal 
      , class Reference 
      , class Difference 
      , class Buffer 
     > 
     class postfix_increment_proxy< 
        range_detail::any_iterator< // line 131 
         Value 
         , Traversal 
         , Reference 
         , Difference 
         , Buffer 
        > 
       > 
     { 
      // ... 
     }; 

Có một lớp khác trong cùng một tệp theo cùng mẫu và tạo ra lỗi giống nhau. range_detail::any_iterator được chuyển tiếp tuyên bố một chút cao lên trong file:

namespace range_detail 
{ 
    // ... 
    template< 
       class Value 
       , class Traversal 
       , class Reference 
       , class Difference 
       , class Buffer = any_iterator_default_buffer 
      > 
      class any_iterator; 
    // ... 
} 

Đối với những gì nó có giá trị, đây là tập hợp các lỗi tôi nhận được từ VS2012:

Error 1 error C2143: syntax error : missing ';' before '<' [path]\boost\range\detail\any_iterator.hpp 131 
Error 2 error C2059: syntax error : '<' [path]\boost\range\detail\any_iterator.hpp 131 
Error 3 error C2065: 'Value' : undeclared identifier [path]\boost\range\detail\any_iterator.hpp 134 
Error 4 error C2065: 'Traversal' : undeclared identifier [path]\boost\range\detail\any_iterator.hpp 135 
Error 5 error C2065: 'Reference' : undeclared identifier [path]\boost\range\detail\any_iterator.hpp 136 
Error 6 error C2065: 'Difference' : undeclared identifier [path]\boost\range\detail\any_iterator.hpp 137 
Error 7 error C2065: 'Buffer' : undeclared identifier [path]\boost\range\detail\any_iterator.hpp 138 
Error 8 error C2923: 'boost::range_detail::any_iterator' : 'Value' is not a valid template type argument for parameter 'Value' [path]\boost\range\detail\any_iterator.hpp 138 
Error 9 error C2923: 'boost::range_detail::any_iterator' : 'Traversal' is not a valid template type argument for parameter 'Traversal' [path]\boost\range\detail\any_iterator.hpp 138 
Error 10 error C2923: 'boost::range_detail::any_iterator' : 'Reference' is not a valid template type argument for parameter 'Reference' [path]\boost\range\detail\any_iterator.hpp 138 
Error 11 error C2923: 'boost::range_detail::any_iterator' : 'Difference' is not a valid template type argument for parameter 'Difference' [path]\boost\range\detail\any_iterator.hpp 138 
Error 12 error C2923: 'boost::range_detail::any_iterator' : 'Buffer' is not a valid template type argument for parameter 'Buffer' [path]\boost\range\detail\any_iterator.hpp 138 
Error 13 error C2143: syntax error : missing ';' before '{' [path]\boost\range\detail\any_iterator.hpp 140 
Error 14 error C2447: '{' : missing function header (old-style formal list?) [path]\boost\range\detail\any_iterator.hpp 140 

Có ai biết một workaround?

+0

Đó chỉ là một đặc tả từng phần của 'postfix_increment_proxy 'cho' T' là bất kỳ' any_iterator' loại. Nó trông có vẻ phức tạp bởi vì 'any_iterator' được vẽ trên 5 thứ và bạn phải tái tạo tất cả chúng để thực hiện chuyên môn - nhưng phần mã đó trông hoàn toàn ổn. Tôi không biết tại sao nó không biên dịch tho. – Barry

+0

@Barry OK; Tôi đã bỏ lỡ rằng iterator_facade.hpp trước đây đã khai báo 'template postix_increment_proxy', vì vậy tôi không thể tìm ra nơi' T' đó đến từ đâu. (câu hỏi đã chỉnh sửa) – dlf

+0

Và thực sự có vẻ như nó có thể dẫn tôi đến câu trả lời - 'postfix_increment_proxy' nằm trong namespace 'boost :: iterators :: detail', nhưng cách sử dụng nó trong' any_iterator.hpp' (có các lớp không phải trong không gian tên đó) là không đủ tiêu chuẩn. – dlf

Trả lời

10

Điều này dường như là một lỗi trong codebase tăng. postfix_increment_proxywritable_postfix_increment_proxy đều nằm trong không gian tên boost::iterators::detail (iterator_facade.hpp). Tuy nhiên, cả hai tên được sử dụng không đủ tiêu chuẩn trong any_iterator.hpp. Thêm boost::iterators::detail:: trước cả hai tên cho phép mã biên dịch.

Đối với bất kỳ ai không thoải mái với ý tưởng chỉnh sửa mã tăng cường, bao gồm iterator_facade.hpp, theo sau là using namespace boost::iterators::detail, tiếp theo là bao gồm cho any_iterator.hpp cũng sẽ giải quyết vấn đề với chi phí ô nhiễm không gian tên. VS2012 không hỗ trợ chúng vì vậy nó không làm tôi tốt, nhưng bạn có thể sử dụng một C++ 11 bằng cách sử dụng quá.

vé gửi: https://svn.boost.org/trac/boost/ticket/10754

+1

Tôi nghĩ rằng cách giải quyết được mô tả là không chính xác. Nó có thể làm việc cho MSVC nhưng chỉ vì logic chuyên môn bị hỏng sau đó. Bản sửa lỗi là chuyên các lớp bên trong không gian tên 'boost :: iterators :: detail' thay vì' boost :: detail' – sehe

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