Я обновил версию gcc, gcc --version дает следующий результат
gcc (Ubuntu 8.1.0-5ubuntu1~16.04) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
я могу включить файловую систему в файл заголовка без каких-либо ошибок
#include<filesystem>
Но когда я пытаюсь получить доступ к файловой системе пространства имен, как показано ниже, я получаю сообщение об ошибке
namespace fs = std::filesystem;
Сообщение об ошибке
error: ‘filesystem’ is not a namespace-name
namespace fs = std::filesystem;
Это кажется странным, поскольку gcc 8 поддерживает std :: filesystem и недоступен в пространстве имен. Я делаю что-то не так при доступе к std :: filesystem?
и да, я построил с -std = C++ 17
Вы компилируете с -std=c++17 или -std=gnu++17?
да, я построил с -std = C++ 17
Возможно актуально: stackoverflow.com/questions/45867379/…
@ Так как это было о gcc v7, gcc v8 уже поддерживает std :: filesystem
Пришло время создать Минимальный, полный и проверяемый пример, чтобы показать нам. А также покажите нам, как вы строите исходный код.





Добавьте библиотеку файловой системы в качестве аргумента вашего компилятора, который будет перенаправлен компоновщику. Также убедитесь, что вы используете C++ 17. И g ++, и clang ++ принимают этот конкретный формат:
--std=c++17 -lstdc++fs
это не сработало, я случайно удалил строку пространства имен, когда я сделал предыдущий ответ, но все равно получаю ту же ошибку.
Что ж, связывание, вероятно, сработает, но вы заблокированы проблемами, которые даже не зайдут так далеко. Попробуйте несколько примеров файловой системы на std :: filesystem @ cppreference, и если это не сработает, просто отредактируйте вопрос.
@Naveen Вы когда-нибудь выясняли, что случилось? Этот старый ответ по-прежнему получает положительные голоса, поэтому кажется, что он помогает другим :-)
К сожалению, нет, ни одно из решений не помогло, после этого я перестал программировать на C++ :-)
@Naveen :-D О нет, это прискорбно. Возможно, вам будет приятно узнать, что с тех пор статус компиляторов значительно улучшился, и я уверен, что мы сможем решить это, если вы дадите C++ еще один шанс :-)
Если это не сработает, убедитесь, что вы ставите -lstdc++fs после имен входных файлов, и убедитесь, что ваш gcc достаточно новый (gcc --version).
--std=c++17 по-прежнему необходим для использования частей <filesystem> в gcc 9.3.0 (это версия, которую поддерживает Ubuntu 20.04), и реализация все еще не завершена. Я был удивлен, что даже через 3 года ситуация все еще остается немного сложной. Поскольку мне нужна всего пара вещей из <filesystem>, я рассматриваю возможность использования других вариантов (даже тех, которые менее переносимы и могут потребовать другой реализации для Windows).
@jrh --std=c++17 или --std=c++<any version after c++17> будут необходимы до тех пор, пока C++ 17 или более поздняя версия не является версией по умолчанию, которую использует компилятор, так что это неудивительно. Какая часть реализации <filesystem> не завершена в g ++?
@TedLyngmo Сообщение, которое я прочитал, в котором упоминалось, что <filesystem> был неполным, я думаю, устарел. страница поддержки стандартов g ++, кажется, говорит, что C++ 17 имеет «почти полную поддержку». Возможно, неудивительно, что C++ 17 еще не был завершен в 2019 году, возможно, gcc всегда нуждался в когда-то для реализации последнего стандарта в компиляторе. Тем не менее, это застало меня врасплох.
Кроме того, VS2013 имеет ограниченную поддержку C++ 11, но (что довольно сбивает с толку), он, похоже, использует противоположную стратегию и предлагает вам использовать выбранные ими особенности C++ 11, если вы явно не говорите, что хотите использовать определенный C++. стандарт. FWIW стратегия VS 2013 более раздражает в 2020 году.
@jrh Поддержка языка C++ 17 не может быть 100%, но важно состояние стандартной реализации библиотека. Кажется, что в gcc 8 есть несоответствующие перегрузки пути basic_fstream, но я не уверен, так ли это в gcc 9 или новее.
несмотря на то, что больше не нужен, кажется обратно совместимым и также работает с gcc9.
@CrocDialer Люди, использующие LTS OS: es, все еще могут наткнуться на это.
Если вы используете IDE, например, кодовые блоки, убедитесь, что установлены флаги компилятора по умолчанию для gcc: -std = C++ 17, а не только для текущего проекта, но и для глобальных флагов.
Если бы эта проблема с CB и установка этого флага в [Настройки / Компилятор] исправили ее (нет необходимости добавлять библиотеку)
Because of the silly rep system, I can't make this a comment on slashmais's answer.
При использовании IDE убедитесь, что вы также установили компилятор для использования в GCC8 или выше.
В моем случае, несмотря на то, что CodeLite был установлен, он использовал более низкую версию GCC и вызывал головную боль (re: не находил заголовок)!
Ручная настройка CodeLite на использование gcc-8 (вместо gcc эта проблема решена.
За сокращение жалкого переходного периода ниже 100, который мы все ненавидели. ;)
Вы собираете с помощью
-std=c++17(в конце концов, это функция C++ 17)?