Frage

Als ich das Iterator Form Parsen für einen Geist Grammatik zu verwenden versuchen, erhalte ich ein Argument Konvertierungsfehler vom Typ char * const iterator vorbei. Wie kann ich dieses Problem beheben?

Es gibt einige Einschränkungen. Ich bin ein Iterator-Adapter auf großen Eingängen verwenden, so ist es nicht möglich für mich zu einer C-Stil-Zeichenfolge zu konvertieren.

Hier ist Beispielcode demonstriert das Problem:

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <vector>
#include <string>
using std;
using boost::spirit;
struct ex : public grammar<route_grammar> {
  template <typename ScannerT> struct defintion {
    definition(ex const& self) {
      expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};

int main() {
  file_iterator<char> first;
  file_iterator<char> last = first.make_end();
  ex ex_p;
  parse_info<file_iterator<char> > info = parse(first, last, ex_p, space_p);
  return 0;
}

Dieser Code bricht mit: Fehler: kann const boost::spirit::file_iterator<char_t, boost::spirit::fileiter_impl::mmap_file_iterator<char_t> > nicht konvertiert in Argumente const char* vorbei

War es hilfreich?

Lösung

Hard aus dem Code zu sagen, wie gebucht, da es ein paar grundlegenden Fehler enthält. Nach der Korrektur dieser, kompiliert es auf meinem Rechner in Ordnung (mit MSVC ++ 7.1):

#include <boost/spirit/core.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace boost::spirit;
struct ex : public grammar<ex> {
template <typename ScannerT> 
struct definition {
    definition(ex const& self)
    {
    expression = real_p; 
    }
    rule<ScannerT> expression;
    rule<ScannerT> const& start() const { return expression; }
};
};

int main() {
vector<char> v;
v.push_back('3'); v.push_back('.'); v.push_back('2');
ex ex_p;
parse_info<vector<char>::iterator> info = parse(v.begin(), v.end(), ex_p, space_p);
return 0;
}

Andere Tipps

Dies ist ein Weg, um den char * s zeigt auf den gleichen Elementen wie die Iteratoren:

&v.front() // v.begin()
&v.back() + 1 // v.end()

Ich bin mir nicht sicher, wie Sie bekam dies allerdings zu kompilieren:

vector<char> v;
v.push_back("3.2");

Der Übersetzungsfehler war nicht in der Probe zur Verfügung gestellt. In der Grammatik oben Ich habe keine semantischen Aktionen, während im Code mir Vereinfachung habe ich getan.

Die Rückrufe für diese Handlungen verwendet char * anstelle des Iteratortyp I wurde mit.

Sie können versuchen, sicherzustellen, dass Ihre semantischen Aktionen von der Art des Arguments polymorpher waren. Gerade in Code würde wollen Sie so etwas wie folgt aus:

struct my_action {
  template <class ParamType>
  void operator()(ParamType const & parameter) const {
    // deal with parameter
  }
};

Sie würden eine unäre semantische Aktion wie folgt verwenden, wie unten dargestellt:

real_p[my_action()]

Oder wenn Sie eine binäre semantische Aktion benötigt, würden Sie so etwas wie:

struct binary_action {
  template <class ParamType>
  void operator()(ParamType const & param1, ParamType const & param2) const {
    // deal with either parameter
  }
};

(*char_p)[binary_action()]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top