C++11 错误与调用主外部的 Ifstream 不匹配

Posted

技术标签:

【中文标题】C++11 错误与调用主外部的 Ifstream 不匹配【英文标题】:C++11 error no match for call to Ifstream outside main 【发布时间】:2016-11-17 23:05:34 【问题描述】:

我是 C++ 新手,正在尝试自学。

我发现了几个与此相关的问题,但没有一个人真正回答了这个问题。我已经启用了 c++11,所以据我所知 ifstream 应该接受一个 std::string 。我也在 Visual Studio、CLion 和 Eclipse Neon 中尝试过,结果完全相同。

我还在运行时检查了 __cplusplus 的值,我知道它设置为 201103,这是构造函数重载所必需的。

基本上,如果我使用 std::string 在主函数中使用 std::ifstream 我没有问题。另一方面,如果我尝试将它传递给另一个文件中的另一个类,我会在 Eclipse 和 Clion 中收到此错误:

“错误:不匹配调用'(std::ifstream aka std::basic_ifstream) (std::__cxx11::string&)' infile(filename);”

Visual Studio 中的这个错误: “错误 C2064:术语不计算为采用 1 个参数的函数”

两个错误都指向同一行,如下面的代码块所示。我想知道我做错了什么,因为我想在课堂上使用 ifstream。

// main.cpp
#include test.h
int main() 
    std::string name("test.txt");
    TestClass test (name);
    std::ifstream testfile(name);
    return 0;


// test.h
#include <fstream>
class TestClass
    std::ifstream infile;
public:
    TestClass(std::string filename); // have also tried with std::string& filename


// test.cpp
TestClass::TestClass(std::string filename)  // again have tried using string&
    infile(filename);  /** ERROR **/

【问题讨论】:

使用成员初始化列表:TestClass::TestClass(std::string filename) : infile(filename) 【参考方案1】:

std::ifstream 不提供operator()(std::string) 重载。因此

infile(filename);

在构造函数体中编译失败。

虽然有一个构造函数采用const std::string&amp;,但可以在您的类成员初始化列表中使用:

TestClass::TestClass(std::string filename) : infile(filename) 
    // Omit that completely: infile(filename);  /** ERROR **/

【讨论】:

有趣,我想我在阅读中还没有遇到过这个。不确定我是否理解它,所以我必须进一步研究它,但它确实有效。

以上是关于C++11 错误与调用主外部的 Ifstream 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C语言中有关外部函数调用的问题

跨域外部接口“NPObject 上的错误调用方法”

ifstream:如何判断指定文件是不是不存在

fstream指针

C++:将 ifstream 与 getline() 一起使用;

c++线程函数中如何调用该方法下的外部函数?