Этот раздел (тело for
) проблематичен:
path fn = it->path().filename(); // extract the filename from the path
v.push_back(fn); // push into vector for later sorting
it
указывает на path
объекты, поэтому я не понимаю, почему вызывается path()
. Кажется, его следует заменить на it->filename()
- Вы нажимаете имена файлов в конце того же вектора, поэтому после цикла у вас будет вектор, содержащий список файлов дважды , сначала с путями, а затем только с именами файлов.
РЕДАКТИРОВАТЬ : Глядя на оригинальный пример, я вижу, что это ваша модификация. Если вы хотите сохранить имена файлов вместо их печати, определите другой вектор string
или path
и сохраните в нем имена файлов, не используйте первый. И удаление вызова на path()
должно решить проблему компиляции.
РЕДАКТИРОВАТЬ 2 : как симпатичный BTW, вы можете добиться как обхода каталога, так и извлечения имени файла за один проход, используя std::transform
вместо std::copy
:
struct fnameExtractor { // functor
string operator() (path& p) { return p.filename().string(); }
};
vector<string> vs;
vector<path> vp;
transform(directory_iterator(p), directory_iterator(), back_inserter(vs),
fnameExtractor());
То же самое с использованием mem_fun_ref
вместо fnameExtractor
функтора:
transform(directory_iterator(p), directory_iterator(), back_inserter(vp),
mem_fun_ref(&path::filename));