2011-09-29 40 views
1

我在C++中實現函數式的東西。目前,我正在尋找一種繼續傳遞文件的方式來枚舉文件。使用std :: wcout的C++中的高階函數失敗,出現錯誤C2248

我有一些代碼,看起來像這樣:

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,但能夠通過COM向它提出了功能。

但我得到的錯誤:

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : 
    cannot access private member declared in 
    class 'std::basic_ios<_Elem,_Traits>' 

我在做什麼錯?我爲此嘗試瘋了嗎?

注:我的功能術語(高階,延續等)可能是錯誤的。隨時糾正我。

+1

您無法通過值傳遞wostream。僅供參考。 'std :: wostream&out' –

+0

爲什麼'display_file_details'是一個生成器而不是實際的函數? –

+0

因爲我在玩耍,這就是我在功能風格的C#或F#中所做的。如果我在考慮C++ 03,我想可以使用'bind'。 –

回答

5

display_file_details,你需要把你的wostream作爲參考。 iostream拷貝構造函數是私有的。

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()); }); 
相關問題