Frage

HALLO,

Ich mag keine Probleme kompilieren zu veröffentlichen, aber ich kann wirklich nicht dieses herauszufinden. Mit diesem Code:

#include <map>
#include <boost/iterator/transform_iterator.hpp>

using namespace std;

template <typename K, typename V>
struct get_value
{
    const V& operator ()(std::pair<K, V> const& p) { return p.second; }
};

class test
{
    typedef map<int, float> TMap;
    TMap mymap;

public:
    typedef get_value<TMap::key_type, TMap::value_type> F;
    typedef boost::transform_iterator<F, TMap::iterator> transform_iterator;

    transform_iterator begin()
    {
        return make_transform_iterator(mymap.begin(), F());
    }
};

Erhalten dieser Compiler-Fehler:

transform_iterator.hpp(43) : error C2039: 'result_type' : is not a member of 'get_value<K,V>'
        with
        [
            K=int,
            V=std::pair<const int,float>
        ]

Kann mir jemand erklären, warum dies nicht funktioniert? Ich bin mit Visual Studio 7.0 mit Boost 1.36.0

Danke.

War es hilfreich?

Lösung

Da Sie auch nach einer Erklärung gefragt

Die transform_iterator muss den Rückgabetyp der Funktion, um sich selbst zu instanziieren genannt wissen. Dies wird bestimmt über result_of (gefunden in <boost/utility/result_of.hpp>

Wenn Sie ein Funktionsobjekt zu verwenden, müssen Sie ein Mitglied result_type definieren den Ergebnistyp des Objekts angeben. (Da ein Objekt nicht über einen ‚Rückgabetyp‘ als solche)

Wenn Sie eine reguläre Funktion verwendet haben, würden result_of der Lage, es auf eigene Faust, um herauszufinden, z.

template <typename K, typename V>
const V & get_value(std::pair<K, V> const & p)  { return p.second; }

class test
{
  typedef map<int, float> TMap;
  TMap mymap;

public:
  typedef boost::function< const TMap::mapped_type & (const  TMap::value_type &)  > F;
  typedef boost::transform_iterator<F, TMap::iterator> transform_iterator;

  transform_iterator begin()
  {
    return boost::make_transform_iterator(mymap.begin(), &get_value< int, float >);
  }
};

Andere Tipps

Sie werden get_value von unary_function<const V&, std::pair<K, V> const&> erben zu erzählen transform_iterator was die Unterschrift von get_value ist.

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