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
War es hilfreich?

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.

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