ifstream 没有匹配的初始化构造函数

Posted

技术标签:

【中文标题】ifstream 没有匹配的初始化构造函数【英文标题】:ifstream no matching constructor for initialization 【发布时间】:2019-04-24 14:41:17 【问题描述】:

我正在使用 QT Creator 和 MinGW(均为最新版本),但无法让 ifstream 使用在 c++17 中添加的路径参数构造函数。

编译以下代码将失败:

no matching constructor for initialization of 'std::ifstream' 

我的 QT .pro 文件中有 CONFIG += c++17LIBS += -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);

【问题讨论】:

这看起来只是一个声明,它本身不应该导致你提到的错误。请提供一个独立的小例子,可以在cpp.sh 上编译(或产生编译器错误) 如果您改用std::filesystem::path 会发生什么? filesystem 是 C++17 的一部分,因此您不需要 experimental 出现文件系统未找到错误。我假设 MinGW 与 c++17 文件系统不兼容? cpp.sh 找不到头文件系统 有道理,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

【讨论】:

不幸的是,我仍然遇到同样的错误。一定是编译器? 您使用的是哪个特定的编译器?如果您键入以下指令gcc --version,您的终端上的输出是什么?也尝试在您的终端上运行它并显示输出gcc yourprogram.cpp -o yourprogram 版本 = gcc (MinGW.org GCC-8.2.0-3) 8.2.0 使用 gcc 命令 main.cpp 的编译器输出:在函数“int main()”中:main.cpp:5:12:错误:命名空间“std”中的“文件系统”未命名类型 const std::filesystem::path my_path = "C:/"; ^~~~~~~~~~ main.cpp:6:33: 错误: 'my_path' 未在此范围内声明 std::ifstream input_file_stream(my_path); 您是否在Qt 上设置了编译器? : Tools > Options > C++ , Compilers, Add > MinGW In name put the compiler version, MinGW (version) 这是将在 Kits 中显示的名称 In Compiler path 浏览 C++ 编译器路径,在本例中为 D:\yourPath\ mingw(你的版本)\bin\g++.exe【参考方案2】:
#include<string>
#include<experimental\filesystem>
using namespace std;
using namespace experimental::filesystem;
int main()

    path sourecurrent_path();
    soure /="test.txt";

    ifstream inputu8path(soure).u8string();
    if(!input)
    
        cout<<"source file not exist"<<endl;
    
    path destcurrent_path();
    dest /="test-copy.txt";
    ofstream outputu8path(dest).u8string();

    string line;
    while(!getline(input,line).eof())
    
        output<<line<<endl;
    
    input.close();
    output.close();
    return 0;

【讨论】:

上述解决方案已使用 Qt creator 进行测试并按预期工作

以上是关于ifstream 没有匹配的初始化构造函数的主要内容,如果未能解决你的问题,请参考以下文章

创建对象数组,没有匹配的构造函数初始化错误

std::ifstream 构造函数只接受绝对路径?

C++ 使用继承时没有匹配的构造函数

没有用于使用 VSTGUI 初始化“AEffGUIEditor”的匹配构造函数

C++ 错误:没有用于初始化的匹配构造函数

C++ 错误:没有用于初始化的匹配构造函数