ifstream нет подходящего конструктора для инициализации

#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 и работает должным образом