Steigern Sie den Fehler mit dem Dateisystem -Kompilierfehler
-
20-09-2019 - |
Frage
Ich schreibe einen Code, der die Boost -Dateisystembibliothek verwendet. Hier ist ein Auszug meines Codes:
artist = (this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) ? (*(paths_iterator->parent_path().end() - 1)) : (*(paths_iterator->parent_path().end() - 2));
album = (this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) ? "" : (*(paths_iterator->parent_path().end() - 1));
Typen:
artist and album are of type std::string this->find_diff returns an int this->m_input_path is a std::string paths_iterator is of type std::vector(open bracket)boost::filesystem::path>::iterator
Ich bekomme einen Kompilierfehler:
error C2039: 'advance' : is not a member of 'boost::filesystem::basic_path<String,Traits>::iterator' d:\development\libraries\boost\boost\iterator\iterator_facade.hpp on line 546
Dieser Code ist Teil eines Programms, das ein Stapel -Skript ausgibt, das Lame.exe zum Umwandeln von Dateien in MP3s verwendet. Die Musikbibliothek, für die dies ausgelegt ist, hat das Format:
Wurzel/Künstler/Lied
ODER
Root/Künstler/Album/Song
this-> m_input_path ist der Pfad zu root.
Ich bin mir nicht sicher, ob ich mich dem Problem richtig nähere. Wenn ich das bin, wie kann ich den Fehler beheben, den ich bekomme?
BEARBEITEN:
Mein Code ist jetzt:
boost::filesystem::path::iterator end_path_itr = paths_iterator->parent_path().end();
if(this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) /* For cases where: /root/artist/song */
{
album = "";
end_path_itr--;
artist = *end_path_itr;
}
else /* For cases where: /root/artist/album/song */
{
end_path_itr--;
album = *end_path_itr;
end_path_itr--; <-- Crash Here
artist = *end_path_itr;
}
Der Fehler, den ich jetzt bekomme, ist:
Assertion failed: itr.m_pos && "basic_path::iterator decrement pat begin()", file ... boost\filesystem\path.hpp, line 1444
Lösung
Basic_Path :: Iterator ist ein bidirektionaler Iterator. Arithmetik mit -1 und -2 ist also nicht erlaubt. Operatoren + und - zwischen einem Iterator und einem Ganzzahlwert werden für einen RandomAccessiterator definiert.
Anstatt .Dend ()-1 zu verwenden, können Sie-verwenden-.
Andere Tipps
Ihr neuer Fehler gibt an, dass Ihre end_path_iter
hat nicht genug Elemente (sollte das "Dekrement sein vorbei an Beginnen Sie "?), dh Ihr Weg ist kürzer als Sie erwarten.