我正在编写一些使用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的批处理脚本。 这个音乐库的设计格式为:
根/艺术家/歌曲
OR
根/艺术家/专辑/歌曲
this-&gt; m_input_path是root的路径。
我不确定我是否正确接近这个问题。如果我是,我该如何解决我得到的错误?
编辑:
我的代码现在是:
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 :(得分:3)
basic_path :: iterator是一个双向迭代器。因此不允许使用-1和-2进行算术运算。为RandomAccessIterator定义了迭代器和整数值之间的运算符+和 - 。
不使用.end() - 1,而是使用 - 。
答案 1 :(得分:1)
您的新错误表明您的end_path_iter
没有足够的元素(应该是“减少过去开始”?),即您的路径比您预期的要短。