gpt4 book ai didi

c++ - boost 文件系统版本 3 问题?

转载 作者:行者123 更新时间:2023-11-30 04:34:26 25 4
gpt4 key购买 nike

boost 网站上的示例代码无法正常工作。 http://www.boost.org/doc/libs/1_46_1/libs/filesystem/v3/doc/tutorial.html#Using-path-decomposition

int main(int argc, char* argv[])
{
path p (argv[1]); // p reads clearer than argv[1] in the following code

try
{
if (exists(p)) // does p actually exist?
{
if (is_regular_file(p)) // is p a regular file?
cout << p << " size is " << file_size(p) << '\n';

else if (is_directory(p)) // is p a directory?
{
cout << p << " is a directory containing:\n";

typedef vector<path> vec; // store paths,
vec v; // so we can sort them later

copy(directory_iterator(p), directory_iterator(), back_inserter(v));

sort(v.begin(), v.end()); // sort, since directory iteration
// is not ordered on some file systems

for (vec::const_iterator it (v.begin()); it != v.end(); ++it)
{
path fn = it->path().filename(); // extract the filename from the path
v.push_back(fn); // push into vector for later sorting
}
}

else
cout << p << " exists, but is neither a regular file nor a directory\n";
}
else
cout << p << " does not exist\n";
}

catch (const filesystem_error& ex)
{
cout << ex.what() << '\n';
}

return 0;
}

在 visual studio 2010 中为 path fn = it->path().filename(); 行编译时出现两条错误消息

第一个错误是:'function-style cast' : illegal as right side of '->' operator 第二个错误是:left of '.filename' must have class/结构/union

此外,当我将鼠标悬停在 path() 上时,它说:class boost::filesystem3::path Error: typename not allowed

最佳答案

这部分(for 的正文)有问题:

  path fn = it->path().filename();   // extract the filename from the path
v.push_back(fn); // push into vector for later sorting
  1. it 指向path 对象,所以我不明白为什么要调用path()。似乎应该用 it->filename()
  2. 代替
  3. 您将文件名压入同一 vector 的末尾,因此在循环之后您将拥有包含文件列表的 vector 两次,首先是路径名,然后是文件名。

编辑:查看原始示例,我发现这些是您的修改。如果您想存储文件名而不是打印它们,请定义另一个 stringpath vector 并将文件名存储在其中,不要重复使用第一个。删除对 path() 的调用应该可以解决编译问题。

编辑 2:作为一个可爱的 BTW,您可以使用 std::transform 而不是 std::一次性实现目录遍历和文件名提取:复制:

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

关于c++ - boost 文件系统版本 3 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6026114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com