fstream类成员变量

时间:2016-12-24 19:14:53

标签: c++ linux ubuntu fstream

我花了几个小时跟踪更大代码中的错误。我把它压缩成一个小文件。我需要使用fstream作为清除代码的memeber变量。在线资源说这应该有效。我也尝试用.open()初始化fstream但没有成功。我正在使用g ++编译ubuntu 16.04。

#include <string>
#include <fstream>
#include <iostream>

using namespace std;

class read{
    private:            
        ifstream infile;
    public:
        read(string fileName): infile(fileName.c_str());}
        ~read(){infile.close();}
};

int main(){
    string fileName = "./test/FileCreator/SourceTEST.cpp";
    read r = read(fileName);

return 0;
}

编译错误

/usr/include/c++/5/bits/ios_base.h: In copy constructor ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’:
/usr/include/c++/5/bits/ios_base.h:855:5: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
     ios_base(const ios_base&);
     ^
In file included from /usr/include/c++/5/ios:44:0,
                 from /usr/include/c++/5/istream:38,
                 from /usr/include/c++/5/fstream:38,
                 from smallTestRead.cpp:2:
/usr/include/c++/5/bits/basic_ios.h:67:11: error: within this context
     class basic_ios : public ios_base
           ^
In file included from smallTestRead.cpp:2:0:
/usr/include/c++/5/fstream: In copy constructor ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’:
/usr/include/c++/5/fstream:455:11: note: synthesized method ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ first required here 
     class basic_ifstream : public basic_istream<_CharT, _Traits>
           ^
In file included from /usr/include/c++/5/ios:43:0,
                 from /usr/include/c++/5/istream:38,
                 from /usr/include/c++/5/fstream:38,
                 from smallTestRead.cpp:2:
/usr/include/c++/5/streambuf: In copy constructor ‘std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)’:
/usr/include/c++/5/streambuf:804:7: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’ is private
       basic_streambuf(const basic_streambuf&);
       ^
In file included from smallTestRead.cpp:2:0:
/usr/include/c++/5/fstream:72:11: error: within this context
     class basic_filebuf : public basic_streambuf<_CharT, _Traits>
           ^
/usr/include/c++/5/fstream: In copy constructor ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’:
/usr/include/c++/5/fstream:455:11: note: synthesized method ‘std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)’ first required here 
     class basic_ifstream : public basic_istream<_CharT, _Traits>
           ^
smallTestRead.cpp: In copy constructor ‘read::read(const read&)’:
smallTestRead.cpp:7:7: note: synthesized method ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’ first required here 
 class read{
       ^
smallTestRead.cpp: In function ‘int main()’:
smallTestRead.cpp:17:24: note: synthesized method ‘read::read(const read&)’ first required here 
  read r = read(fileName);

2 个答案:

答案 0 :(得分:1)

在c ++ 11之前的c ++版本上的

read r = read(fileName);首先创建一个未命名的class read实例,然后使用复制构造函数将其复制到r。 C ++的标准io流不可复制,这使得读取不可复制。因此,您尝试使用复制构造函数时会出现错误。

高于c ++ 11的版本将使用移动构造函数,这将使此代码有效,因为标准的io流是可移动的但不可复制。使用read r(fileName);将阻止对所有版本使用任一构造函数,而是构建r

答案 1 :(得分:1)

Stream对象不可复制,因此您不能说:

  read r = read(fileName);

表示包含流对象的read对象。另外,这个:

read(string fileName): infile(fileName.c_str());}

应该是:

read(string fileName): infile(fileName.c_str()) {}