2014-11-05 8 views
8

Nach dem Versuch, ein VS2012-Projekt zu aktualisieren, um Boost 1.57 zu verwenden, kann ich nicht mehr kompilieren - viele und viele Fehlermeldungen kommen aus boost/any_iterator.hpp (siehe unten) . Als Test habe ich ein neues Projekt erstellt, das nichts als eine leere Hauptfunktion und #include "boost/any_iterator.hpp" enthielt und den gleichen Fehlersatz hat. Hier ist der Code es beschwert sich über:Boost/any_iterator.hpp kann nicht in Boost 1.57 kompiliert werden

// 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 
        > 
       > 
     { 
      // ... 
     }; 

Es gibt eine andere Klasse in der gleichen Datei, die das gleiche Muster folgt und erzeugt identische Fehler. range_detail::any_iterator wird voraus erklärt ein wenig höher in der Datei:

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

Für das, was es wert ist, hier ist die Menge der Fehler, die ich von VS2012 erhalten:

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 

Ist jemand bewusst dieses Problem zu umgehen?

+0

das ist nur eine partielle Spezialisierung von 'postfix_increment_proxy ' für 'T' ist jeder' any_iterator' Typ. Es sieht einfach kompliziert aus, weil 'any_iterator' auf 5 Dinge gestempelt wird und man sie alle reproduzieren muss, um die Spezialisierung zu machen - aber dieser Teil des Codes sieht total gut aus. Ich habe keine Ahnung, warum es nicht kompiliert. – Barry

+0

@Barry Verstanden; Ich habe übersehen, dass iterator_facade.hpp zuvor 'template postix_increment_proxy' deklariert hatte, so dass ich nicht herausfinden konnte, woher dieses' T' kam. (Frage bearbeitet) – dlf

+0

Und das sieht tatsächlich so aus, als hätte es mich zu der Antwort geführt - 'postfix_increment_proxy' befindet sich im' boost :: iterators :: detail' Namensraum, aber seine Verwendung in 'any_iterator.hpp' (deren Klassen sind nicht in diesem Namensraum) ist unqualifiziert. – dlf

Antwort

10

Dies scheint ein Fehler in der Boost-Codebasis zu sein. postfix_increment_proxy und writable_postfix_increment_proxy sind beide im Namespace boost::iterators::detail (iterator_facade.hpp). Beide Namen werden jedoch in any_iterator.hpp uneingeschränkt verwendet. Durch Hinzufügen von boost::iterators::detail:: vor beiden Namen kann der Code kompiliert werden.

Für jeden, der sich mit der Idee des Bearbeitens von Boost-Code nicht wohl fühlt, einschließlich iterator_facade.hpp, gefolgt von using namespace boost::iterators::detail, gefolgt von einem Include für any_iterator.hpp, löst das Problem auch auf Kosten der Namensraumverschmutzung. VS2012 unterstützt sie nicht, also tut es mir nicht gut, aber Sie könnten vermutlich auch ein C++ 11 verwenden.

Ticket vorgelegt: https://svn.boost.org/trac/boost/ticket/10754

+1

Ich denke, dass die beschriebene Problemumgehung nicht genau ist. Es könnte für MSVC funktionieren, aber nur aufgrund einer defekten Spezialisierungslogik. Die Lösung besteht darin, die Klassen im Namespace 'boost :: iterators :: detail' zu spezialisieren, anstatt' boost :: detail' – sehe

Verwandte Themen