Функции высшего порядка в C ++, использование std :: wcout завершается ошибкой C2248 - PullRequest
1 голос
/ 29 сентября 2011

Я играю с реализацией вещей в функциональном стиле на 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>'

Что я делаю не так?Я безумен, пытаясь это сделать?

Примечание: моя функциональная терминология (высшего порядка, продолжения и т. Д.), Вероятно, неверна.Не стесняйтесь поправлять меня.

Ответы [ 2 ]

5 голосов
/ 29 сентября 2011

В display_file_details вам нужно взять свой меч по ссылке. Конструкторы копирования iostream являются частными.

4 голосов
/ 29 сентября 2011

Более подробно изучив вывод компилятора, я обнаружил следующее:

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::for_each(begin, end,
    [&process] (boost::filesystem::directory_entry d)
    { process(d.path().wstring()); });
...