C ++ - ни один оператор "<<" не соответствует этим операндам directory_iterator () - PullRequest
0 голосов
/ 22 ноября 2018

Я скопировал пример кода на странице directory_iterator , так что вот что у меня есть:

#include "pch.h" //for visual studios benefit
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    std::ofstream("sandbox/file2.txt");
    for (auto& p : fs::directory_iterator("sandbox"))
        std::cout << p << '\n'; //this line on the first '<<' is where the error occurs
    fs::remove_all("sandbox");
    return 0; //included by me
}

И сообщение об ошибке:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0349   no operator "<<" matches these operands 

Поскольку я новичок в C ++, я мог ошибиться, но мое понимание ошибки в основном состоит в том, что p в моем случае - это то, что не может быть выведено на консоль с использованием cout.

Пример работает, если я запускаю его прямо на странице, поэтому в этом нет ничего плохого, чего я тоже не ожидал.Итак, вопрос в том, почему я вижу эту ошибку?

Я использую последнюю версию Visual Studio вместе с C ++ 2017.

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

directory_entry не поддерживает потоковую передачу напрямую;он получает это через path operator<< плюс неявное преобразование в const std::filesystem::path &.

В результате LWG выдает 2989 и 3065 , *Операторы 1011 * превратились в скрытых друзей и больше не могут использоваться для потоковой передачи вещей, конвертируемых в path, таких как directory_entry.

Исправление заключается в запросе .path()напрямую, а не зависеть от неявного преобразования.Я исправил пример cppreference.


После проверки в LWG это изменение кажется непреднамеренным.Я подал LWG 3171 .

0 голосов
/ 22 ноября 2018

Измените это:

namespace fs = std::filesystem;

на это:

namespace fs = std::experimental::filesystem;

, поскольку VS 17 использует экспериментальную версию filesystem.

0 голосов
/ 22 ноября 2018

Используйте пространство имен std::experimental:

namespace fs = std::experimental::filesystem;
0 голосов
/ 22 ноября 2018

Для Visual Studio 2017 (15.8 и 15.9, если я не ошибаюсь), filesystem предоставляет только экспериментальную версию, поэтому используйте:

namespace fs = std::experimental::filesystem;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...