//为什么这样做?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream inputStream("scores.txt");
string line;
getline(inputStream, line);
cout << line;
return 0;
}
//但是这会因编译器错误而失败。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream GetStream() {
ifstream inputStream("scores.txt");
return inputStream;
}
int main() {
ifstream inputStream = GetStream();
string line;
getline(inputStream, line);
cout << line;
return 0;
}
在mac osx 10.6 w / g ++ 4.2.1上编译
georges-iMac:cs106b george $ g ++ help.cpp -o help /usr/include/c++/4.2.1/bits/ios_base.h:在复制构造函数'std :: basic_ios&gt; :: basic_ios(const std :: basic_ios&gt;&amp;)'中: /usr/include/c++/4.2.1/bits/ios_base.h:779:错误:'std :: ios_base :: ios_base(const std :: ios_base&amp;)'是私有的 /usr/include/c++/4.2.1/iosfwd:55:错误:在此上下文中 /usr/include/c++/4.2.1/iosfwd:在复制构造函数'std :: basic_ifstream&gt; :: basic_ifstream(const std :: basic_ifstream&gt;&amp;)'中: /usr/include/c++/4.2.1/iosfwd:89:注意:这里首先需要合成方法'std :: basic_ios&gt; :: basic_ios(const std :: basic_ios&gt;&amp;)' /usr/include/c++/4.2.1/streambuf:在复制构造函数'std :: basic_filebuf&gt; :: basic_filebuf(const std :: basic_filebuf&gt;&amp;)'中: /usr/include/c++/4.2.1/streambuf:794:错误:'std :: basic_streambuf&lt; _CharT,_Traits&gt; :: basic_streambuf(const std :: basic_streambuf&lt; _CharT,_Traits&gt;&amp;)[with _CharT = char, _Traits = std :: char_traits]'是私有的 /usr/include/c++/4.2.1/iosfwd:86:错误:在此上下文中 /usr/include/c++/4.2.1/iosfwd:在复制构造函数'std :: basic_ifstream&gt; :: basic_ifstream(const std :: basic_ifstream&gt;&amp;)'中: /usr/include/c++/4.2.1/iosfwd:89:注意:这里首先需要合成方法'std :: basic_filebuf&gt; :: basic_filebuf(const std :: basic_filebuf&gt;&amp;)' help.cpp:在函数'std :: ifstream GetStream()'中: help.cpp:9:注意:合成方法'std :: basic_ifstream&gt; :: basic_ifstream(const std :: basic_ifstream&gt;&amp;)'这里首先要求
答案 0 :(得分:6)
问题出在这个功能上:
ifstream GetStream() {
ifstream inputStream("scores.txt");
return inputStream;
}
您正在按值返回流对象,这是不允许的,因为它需要复制本地对象,但您不能制作流对象的副本。通过使复制构造函数私有来复制C ++中的任何流是禁用。任何方式都是任意的,无论是stringstream
,istream
,ostream
,iostream
还是其他。请阅读我的帖子,了解其残疾人的理由:
现在,您可能希望通过引用返回它,但您也不能通过引用返回它,因为inputStream
是本地对象。
你可以试试这个:
ifstream* GetStream() {
return new ifstream("scores.txt");
}
int main() {
ifstream *inputStream = GetStream();
if ( inputStream && *inputStream )
{
string line;
getline(*inputStream, line);
cout << line;
}
if ( inputStream )
delete inputStream;
return 0;
}
但我想知道你为什么这样做。为什么不将所有内容封装在一个类中?
答案 1 :(得分:2)
因为GetStream()
隐式调用ifstream
的复制构造函数,这是无效的,因为其中一个ifstream
基类具有私有复制构造函数。
答案 2 :(得分:0)
我在我的Windows电脑上测试过,一切都运行正常,没有任何错误。不知道那里发生了什么。
关于第一条评论(@Nawaz),行:
ifstream GetStream() {
不是:ifstream
返回类型?所以你必须回复吗?