2014-11-05 70 views
8

在尝试升级VS2012项目以使用boost 1.57之后,我无法再编译 - 从boost/any_iterator.hpp(参见下文)出来的很多很多错误消息, 。作为一项测试,我创建了一个新的项目,它只包含一个空主函数,并且获得了相同的一组错误。下面是它的抱怨代码:无法在boost中编译boost/any_iterator.hpp 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 
        > 
       > 
     { 
      // ... 
     }; 

有在遵循相同的模式,并产生相同的错误同一个文件的类。 range_detail::any_iterator向前声明的高一点了文件:

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

对于它的价值,这里的一套错误的,我从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 

是任何人都知道的一种解决方法?

+0

这只是一个局部特殊化'postfix_increment_proxy ''为是T'任何'any_iterator'类型。它看起来很复杂,因为'any_iterator'模板化了5件事情,你必须重现所有这些特性 - 但这部分代码看起来非常好。我不知道为什么它不编译。 – Barry 2014-11-05 14:46:41

+0

@Barry明白了;我错过了iterator_facade.hpp之前已经声明过'template postix_increment_proxy',所以我无法弄清楚'T'是从哪里来的。 (编辑问题) – dlf 2014-11-05 14:52:55

+0

而这看起来像它可能会让我回答 - 'postfix_increment_proxy'在'boost :: iterators :: detail'命名空间中,但它在'any_iterator.hpp'中的用法(其类是不在该名称空间中)是不合格的。 – dlf 2014-11-05 14:58:53

回答

10

这似乎是boost代码库中的一个错误。 postfix_increment_proxywritable_postfix_increment_proxy都位于boost::iterators::detail命名空间(iterator_facade.hpp)中。但是,这两个名称在any_iterator.hpp中都是不合格的。在两个名称前添加boost::iterators::detail::可以编译代码。

对于任何对编辑boost代码的想法感到不安的人,包括iterator_facade.hpp,然后是using namespace boost::iterators::detail,然后再加上for any_iterator.hpp也会解决问题,代价是命名空间污染。 VS2012不支持它们,所以它对我没有任何好处,但你也可以使用C++ 11。提交

票: https://svn.boost.org/trac/boost/ticket/10754

+1

我认为所描述的解决方法是不准确的。它可能适用于MSVC,但只是由于专业化逻辑的破坏。解决的办法是专门化名称空间'boost :: iterators :: detail'中的类而不是'boost :: detail' – sehe 2014-12-24 22:48:15