#c #qt #qt-creator #c 17
#c #qt #qt-creator #c 17
Вопрос:
Я использую QT Creator и MinGW (обе последние версии), и у меня возникли проблемы с получением ifstream для использования конструктора аргументов path, добавленного в c 17.
Компиляция приведенного ниже кода завершится ошибкой с:
no matching constructor for initialization of 'std::ifstream'
У меня есть CONFIG = c 17
в моем файле QT .pro и LIBS = -lstdc fs
MCV https://gcc.godbolt.org/z/Lb3MNT
#include <experimental/filesystem>
#include <fstream>
int main() {
const std::experimental::filesystem::path my_path = "C:/";
std::ifstream input_file_stream(my_path);
}
Комментарии:
1. Это выглядит как просто объявление, которое само по себе не должно приводить к упомянутой вами ошибке. Пожалуйста, предоставьте автономный небольшой пример, что-то, что будет компилироваться (или выдавать ошибку компилятора) на cpp.sh
2. Что произойдет, если вместо этого использовать
std::filesystem::path
?filesystem
является частью C 17, поэтому вам не нуженexperimental
.3. Выдает ошибку «файловая система не найдена». Я предполагаю, что MinGW не имеет надлежащей совместимости с файловой системой c 17?
4. cpp.sh не удается найти файловую систему заголовка
5. Имеет смысл, cpp.sh пока не поддерживает C 17. Возможно, вы можете сделать это на gcc.godbolt.org или onlinegdb.com/online_c _compiler которые, похоже, поддерживают его
Ответ №1:
@ user1406186, я повторил вашу ту же ошибку и смог скомпилировать ее, применив следующие изменения к .pro
файлу, и мне пришлось указать QMAKE
, который мне нужно было использовать:
TEMPLATE = app
CONFIG = console c 11
QMAKE_CXXFLAGS = -std=gnu 11
CONFIG -= app_bundle
CONFIG -= qt
SOURCES =
main.cpp
HEADERS =
LIBS = -lstdc fs
Он также скомпилирован со следующими стандартами C 14 / C 11:
TEMPLATE = app
CONFIG = console c 14
QMAKE_CXXFLAGS = -std=gnu 14
CONFIG -= app_bundle
CONFIG -= qt
SOURCES =
main.cpp
HEADERS =
LIBS = -lstdc fs
Комментарии:
1. К сожалению, я все еще получаю ту же ошибку. Это должен быть компилятор?
2. Какой конкретный компилятор вы используете? какой результат будет на вашем терминале, если вы введете следующую инструкцию
gcc --version
? также попробуйте запустить это на своем терминале и показать результатgcc yourprogram.cpp -o yourprogram
3. версия = gcc (MinGW.org GCC-8.2.0-3) 8.2.0
4. вывод компилятора с помощью команды gcc main.cpp : В функции ‘int main()’: main.cpp:5:12: ошибка: ‘файловая система’ в пространстве имен ‘std’ не называет тип const std::файловая система::путь my_path = «C:/»; ^~~~~~~~~~ main.cpp:6:33: ошибка: ‘my_path’ не был объявлен в этой области std::ifstream input_file_stream(my_path);
5. Вы установили компилятор на свой
Qt
? : Инструменты> Параметры> C , компиляторы, Добавить > MinGW В имени укажите версию компилятора, MinGW (версия) Это имя, которое будет отображаться в наборах в пути компилятора, в этом случае найдите путь к компилятору C D:yourPathmingw (ваша версия)bing .exe
Ответ №2:
#include<string>
#include<experimentalfilesystem>
using namespace std;
using namespace experimental::filesystem;
int main()
{
path soure{current_path()};
soure /="test.txt";
ifstream input{u8path(soure).u8string()};
if(!input)
{
cout<<"source file not exist"<<endl;
}
path dest{current_path()};
dest /="test-copy.txt";
ofstream output{u8path(dest).u8string()};
string line;
while(!getline(input,line).eof())
{
output<<line<<endl;
}
input.close();
output.close();
return 0;
}
Комментарии:
1. вышеупомянутое решение протестировано с помощью Qt creator и работает должным образом