从函数调用时的c ++ getline编译错误

时间:2011-08-08 10:21:49

标签: c++

//为什么这样做?

#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;)'这里首先要求

3 个答案:

答案 0 :(得分:6)

问题出在这个功能上:

ifstream GetStream() {
  ifstream inputStream("scores.txt");
  return inputStream;
}

您正在按值返回对象,这是不允许的,因为它需要复制本地对象,但您不能制作流对象的副本。通过使复制构造函数私有来复制C ++中的任何流是禁用。任何方式都是任意的,无论是stringstreamistreamostreamiostream还是其他。请阅读我的帖子,了解其残疾人的理由:

现在,您可能希望通过引用返回它,但您也不能通过引用返回它,因为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返回类型?所以你必须回复吗?