Geloest: Boost::tokenizer::iterator Problem
-
Hi,
ich wollte fuer mein Programm Boost::tokenizer bzw den iterator benutzen. Hab das so gemacht wie die das auf der Doc-Seite gamacht haben: Boost::tokenizer
Jetzt hab ich haber das Problem das der mir einen Fehler ausspuckt:
'advance': Ist kein Element von 'boost::token_iterator<TokenizerFunc,Iterator,Type>'Und meine Codeausschnitt hab ich jetzt auf das begrenzt:
boost::char_separator<char> Sep( NEW_LINE ); boost::tokenizer<boost::char_separator<char> > Tokens( m_Headers, Sep); boost::tokenizer<boost::char_separator<char> >::iterator iter; /* <-- fehler hier */Ich versteh das ned :(.
Gruss
-
Bitte poste ein kompilierbares Beispiel mit dem Fehler.
-
Hmm ja schwierig. Hab jetzt den gleichen Code einfach mal in die Main geklatscht und hat einwanfrei funktioniert.
#include <boost\tokenizer.hpp> #include <string> class Parser { public: Parser() { Test(); }; protected: typedef boost::tokenizer<boost::char_separator<char> > tokenizer; void Test(); /*.....*/ std::string m_Head; std::string m_Headers; std::string m_Data; }; void Parser::Test() { boost::char_separator<char> Sep( " " ); tokenizer Tokens( m_Head, Sep); tokenizer::iterator iter = Tokens.begin(); } int main(int argc, char** argv) { Parser parse; }Wenn ich jetzt aber denn Code in ein neues Projekt kopiert, geht auch alles. In meinem Hauptprojekt sind halt noch ein paar weiter Methoden und Variablen, aber an denn kanns ja ned liegen oder!?
Ich bin total verwirrt
-
C0de4Fun schrieb:
In meinem Hauptprojekt sind halt noch ein paar weiter Methoden und Variablen, aber an denn kanns ja ned liegen oder!?
Der einzige Unterschied zwischen nicht-funktionierend und funktionierend sind also diese Methoden und Variablen? Dann kann ich deine Schlussfolgerungen nicht nachvollziehen.
-
Falls die ganze Fehlermeldung was hilft:
d:\programming\cpp_programs\library\boost_1_45_0\boost\iterator\iterator_facade.hpp(546): error C2039: 'advance': Ist kein Element von 'boost::token_iterator<TokenizerFunc,Iterator,Type>' 1> with 1> [ 1> TokenizerFunc=boost::char_separator<char>, 1> Iterator=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, 1> Type=std::string 1> ] 1> d:\programming\cpp_programs\library\boost_1_45_0\boost\iterator\iterator_facade.hpp(694): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::iterator_core_access::advance<Derived>(Facade &,__w64 int)". 1> with 1> [ 1> Derived=boost::token_iterator<boost::char_separator<char>,std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,std::string>, 1> Facade=boost::token_iterator<boost::char_separator<char>,std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,std::string> 1> ] 1> d:\programming\cpp_programs\library\boost_1_45_0\boost\iterator\iterator_facade.hpp(693): Bei der Kompilierung der Klassen-template der boost::token_iterator<TokenizerFunc,Iterator,Type> &boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference>::operator +=(__w64 int)-Memberfunktion 1> with 1> [ 1> TokenizerFunc=boost::char_separator<char>, 1> Iterator=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, 1> Type=std::string, 1> Derived=boost::token_iterator<boost::char_separator<char>,std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,std::string>, 1> Value=std::string, 1> CategoryOrTraversal=boost::forward_traversal_tag, 1> Reference=const std::string & 1> ] 1> d:\programming\cpp_programs\library\boost_1_45_0\boost\token_iterator.hpp(40): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::iterator_facade<Derived,Value,CategoryOrTraversal,Reference>". 1> with 1> [ 1> Derived=boost::token_iterator<boost::char_separator<char>,std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>,std::string>, 1> Value=std::string, 1> CategoryOrTraversal=boost::forward_traversal_tag, 1> Reference=const std::string & 1> ] 1> d:\programming\cpp_programs\library\source\network\http.cpp(96): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::token_iterator<TokenizerFunc,Iterator,Type>". 1> with 1> [ 1> TokenizerFunc=boost::char_separator<char>, 1> Iterator=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>, 1> Type=std::string 1> ]SeppJ schrieb:
C0de4Fun schrieb:
In meinem Hauptprojekt sind halt noch ein paar weiter Methoden und Variablen, aber an denn kanns ja ned liegen oder!?
Der einzige Unterschied zwischen nicht-funktionierend und funktionierend sind also diese Methoden und Variablen? Dann kann ich deine Schlussfolgerungen nicht nachvollziehen.
Joa jetzt ist das 2te komische das ich eine abgeleitete Klasse habe in dessen Methoden ich auch den tokenizer benutzt und da kommen auch keine Fehlermeldungen
Geht doch ned lag wohl dran das ich vorher keine Instanz davon erzeugt habe
-
Also Leute ich hab jetzt des Raetsels Loesung gefunden.
Ich hatte in einer Methode das hier stehen:
bool RequestParser::SetData( std::string Data, DataMap& Map) { boost::char_separator<char> Sep( "&=", "", boost::keep_empty_tokens ); http::tokenizer Tokens( Data, Sep); tokenizer::iterator iter = Tokens.begin(); tokenizer::iterator iterTmp; for( ; iter != Tokens.end(); iter += 2) { if( (iter + 1) != Tokens.end() ) { #ifdef UNICODE Map[ ConvertStr( *iter ) ] = ConvertStr( *(iter+1) ); #else Map[ *iter ] = *(iter+1 ); #endif } else { LOG4CPLUS_ERROR( m_Logger, _T("Error with the data parsing") ); m_Error = PARSE_ERROR; return false; } } m_Error = PARSE_SUCCESS; return true; }Na wer erkennt den Fehler?
iter += 2 /*bzw*/ (iter + 1)is wohl auch fuer die boost iteratoren verboten.
Hab jetzt grad noch im C++ Primer nachgelesen und das steht auch:c++ primer schrieb:
Std Container iterator Operations:
*iter
iter->mem
++iter
iter++
/*gleiche fuer --*/
iter1 == iter2
iter1 != iter2und nur speziel fuer vector bzw deque iterators:
c++ primer schrieb:
iter + n
iter - n
iter += n
iter -= n
iter1 - iter2
<,<=,>,>=Nagut jetzt bin ich au um ein Stueckchen klueger.
Greetz