Frage

Visual Studio Enterprise 2010, sp1, unter Windows 7 64bit.Boost 1.48.0.

Hier beginnt der entsprechende Code.Diese Bits werden in einem Header definiert.

//typedef struct {} empty_t;
//typedef std::pair<size_t, std::shared_ptr<char>> string_t; //Don't ask...
//typedef boost::variant<empty_t, long, double, some other PODs, string_t> variant_t;
//typedef std::map<unsigned short, variant_t> variant_map_t;

und das ist im Hauptteil eines Kopierkonstruktors:

std::for_each(std::begin(incoming.values_), std::end(incoming.values_), [&](variant_map_t::value_type value)
{
    // This guy is going to populate this::values_, doing the right thing -
    // copying by value native and POD types, or deep copying pointers.
    boost::apply_visitor(deep_copy_visitor(*this, value.first), value.second);
});

Der Fehler, den ich finde, liegt in der Parameterliste des Lambda.Ich glaube, swap wird im Kopierkonstruktor des Paares aufgerufen und versucht, zuerst den an das Lambda übergebenen R-Wert dem Parameter zuzuweisen.Der Compiler geht davon aus, dass „value.first“ eine Konstante ist, wenn es im std::pair-Kopierkonstruktor zugewiesen wird.Aber offensichtlich ist der Parameter nicht const-qualifiziert, der mapped_type oder key_type ist nicht const-qualifiziert, der Kopierkonstruktor ist keine const-Methode und NICHTS davon sollte sowieso von Bedeutung sein.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(209) : see reference to function template instantiation 'void std::_Swap_adl<_Ty1>(_Ty &,_Ty &)' being compiled
          with
          [
              _Ty1=unsigned short,
              _Ty=unsigned short
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(206) : while compiling class template member function 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)'
          with
          [
              _Ty1=const unsigned short,
              _Ty2=variant_t
          ]
          src\foo.cpp(506) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
          with
          [
              _Ty1=const unsigned short,
              _Ty2=variant_t
          ]

Irgendwie wird der Vorlagenparameter immer qualifizierter, und ich kann beim besten Willen nicht herausfinden, warum.

Ich glaube, etwas anderes bringt den Compiler zum Stolpern, aber ich habe nichts anderes, wovon ich ausgehen könnte.Bevor ich meinen Quellcode gründlich durchgearbeitet habe, um das herauszufinden, konnte ich diese Fehlermeldung ein- und ausschalten;Ich hatte eine von boost::static_visitor abgeleitete Klasse definiert.Keine Mitglieder, keine Methoden, nichts.Das reichte aus, um diesen Fehler in meinem Kopierkonstruktor hier zu verursachen.Ich kann mir nicht vorstellen, wie ich das, was ist, sonst isolieren könnte EIGENTLICH die beleidigende Codezeile ...

Glaubt jemand, dass dies ein Compiler-Problem ist und dass eine nicht erwähnte Änderung dies als Nebeneffekt hat?

War es hilfreich?

Lösung

Der value_type von std::map<K, V> Ist std::pair<K const, V>, weil die Schlüssel unveränderlich sind.Also ja, value.first ist const-qualifiziert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top