2009-12-21 3 views
1

Я пишу код, который использует библиотеку файловой системы boost. Вот выдержка из моего кода:Ошибка компиляции файловой системы Boost

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)); 

Типы:

 
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 

Я получаю ошибку компиляции:

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 

Этот код является частью программы, которая выводит пакетный скрипт, который использует lame.exe для преобразования файлов в mp3. музыка библиотека этого предназначена для имеет формат:

корень/исполнителя/песни

ИЛИ

корень/исполнитель/альбом/песня

this-> m_input_path путь к корню ,

Я не уверен, правильно ли я подошел к проблеме. Если да, то как я могу исправить ошибку, которую я получаю?

EDIT:

Мой код теперь:

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; 
    } 

ошибка, что я теперь получаю:

Assertion failed: itr.m_pos && "basic_path::iterator decrement pat begin()", file ... boost\filesystem\path.hpp, line 1444 
+0

Какая версия повышения вы используете? –

+0

Boost 1.41.0 - 15char –

ответ

3

basic_path :: итератор является двунаправленным итератора. Таким образом, арифметика с -1 и -2 недопустима. Операторы + и - между итератором и целочисленным значением определены для RandomAccessIterator.

Вместо использования .end() - 1, вы можете прибегнуть к использованию -.

1

Ваша новая ошибка указывает на то, что ваш end_path_iter не имеет достаточного количества элементов (это должно быть «декремент прошлое начать?»), То есть ваш путь короче, чем вы ожидаете.

+0

А, это проблема, я не должен был использовать parent_path в paths_iterator-> parent_path(). End(); Спасибо за вашу помощь. –

Смежные вопросы