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&
,但可以在您的类成员初始化列表中使用:
TestClass::TestClass(std::string filename) : infile(filename)
// Omit that completely: infile(filename); /** ERROR **/
【讨论】:
有趣,我想我在阅读中还没有遇到过这个。不确定我是否理解它,所以我必须进一步研究它,但它确实有效。以上是关于C++11 错误与调用主外部的 Ifstream 不匹配的主要内容,如果未能解决你的问题,请参考以下文章