我正在玩C ++中实现功能风格的东西。目前,我正在寻找一种枚举文件的延续传递方式。
我有一些看起来像这样的代码:
namespace directory
{
void find_files(
std::wstring &path,
std::function<void (std::wstring)> process)
{
boost::filesystem::directory_iterator begin(path);
boost::filesystem::directory_iterator end;
std::for_each(begin, end, process);
}
}
然后我这样称呼它:
directory::find_files(source_root, display_file_details(std::wcout));
...其中display_file_details
的定义如下:
std::function<void (std::wstring)>
display_file_details(std::wostream out)
{
return [&out] (std::wstring path) { out << path << std::endl; };
}
计划是将继续传递给find_files
,但是能够将组合函数传递给它。
但我收到错误:
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' :
cannot access private member declared in
class 'std::basic_ios<_Elem,_Traits>'
我做错了什么?尝试这个我是疯了吗?
注意:我的功能术语(高阶,延续等)可能是错误的。随意纠正我。
答案 0 :(得分:5)
在display_file_details
中,你需要参考你的wostream。 iostream复制构造函数是私有的。
答案 1 :(得分:4)
在深入研究编译器输出后,我发现了这个:
This diagnostic occurred in the compiler generated function
'std::basic_ostream<_Elem,_Traits>::
basic_ostream(const std::basic_ostream<_Elem,_Traits> &)'
事实证明,basic_ostream没有可用的复制构造函数。
将std::wostream out
更改为std::wostream & out
可以解决问题。至少到了我得到一堆其他错误。这些很容易通过以下方式解决:
std::for_each(begin, end,
[&process] (boost::filesystem::directory_entry d)
{ process(d.path().wstring()); });