2015-10-27 54 views
2

我试图做一个程序,一些简单的方法,这是我的一类:文件I/O错误拷贝构造函数C++

Example.cpp:

#include "Example.hpp" 

using namespace std; 

ifstream Example::getStream(const char *inputFile) const { 
    ifstream myFile; 
    myFile.open(inputFile); 
    return myFile; 
} 

Example.hpp:

#include <fstream> 
#include <map> 

#ifndef EXAMPLE_HPP 
#define EXAMPLE_HPP 

using namespace std; 

class Example { 
    public: 
     map<int, int> *exampleMap; 

    ifstream getStream(const char *inputFile) const; 
}; 

#endif 

这是由程序中的其他子类实现的,它将在未来非常有用。然而,现在,当我尝试建立这个,它返回我这些错误:

In file included from /usr/include/c++/4.8/ios:42:0, 
       from /usr/include/c++/4.8/istream:38, 
       from /usr/include/c++/4.8/fstream:38, 
       from ../Example.hpp:1, 
       from ../Example.cpp:1: 
/usr/include/c++/4.8/bits/ios_base.h: In copy constructor ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’: 
/usr/include/c++/4.8/bits/ios_base.h:786: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++/4.8/ios:44:0, 
       from /usr/include/c++/4.8/istream:38, 
       from /usr/include/c++/4.8/fstream:38, 
       from ../Example.hpp:1, 
       from ../Example.cpp:1: 
/usr/include/c++/4.8/bits/basic_ios.h:66:11: error: within this context 
    class basic_ios : public ios_base 
     ^
In file included from ../Example.hpp:1:0, 
       from ../Example.cpp:1: 
/usr/include/c++/4.8/fstream: In copy constructor ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’: 
/usr/include/c++/4.8/fstream:427: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++/4.8/ios:43:0, 
       from /usr/include/c++/4.8/istream:38, 
       from /usr/include/c++/4.8/fstream:38, 
       from ../Example.hpp:1, 
       from ../Example.cpp:1: 
/usr/include/c++/4.8/streambuf: In copy constructor ‘std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)’: 
/usr/include/c++/4.8/streambuf:802: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& __sb) 
    ^
In file included from ../Example.hpp:1:0, 
       from ../Example.cpp:1: 
/usr/include/c++/4.8/fstream:72:11: error: within this context 
    class basic_filebuf : public basic_streambuf<_CharT, _Traits> 
     ^
/usr/include/c++/4.8/fstream: In copy constructor ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’: 
/usr/include/c++/4.8/fstream:427: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> 
     ^
../Example.cpp: In member function ‘std::ifstream Example::getStream(const char*) const’: 
../Example.cpp:13:12: note: synthesized method ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’ first required here 
    return myFile; 
      ^
make: *** [Example.o] Error 1 

我试图找出我做了什么错在这里。这与包含有关吗?这是我看不到的一些错字吗?

在此先感谢。

回答

4

您正在尝试按值返回流。这是不可能的,C++ 11之前(以及gcc 4.X的标准库实现)因为不能复制流而C++ 98没有移动语义。

所以在C++ 11中,这段代码很好;如果您的实施还没有完全实现它,你需要一个解决办法像传递一个非const参考,如:

#ifndef EXAMPLE_HPP 
#define EXAMPLE_HPP 

#include <fstream> 
#include <map> 

class Example 
{ 
public: 
    std::map<int, int> *exampleMap; 

    bool openFile(const char *inputFile, std::ifstream &myFile) const; 
}; 

#endif 

#include "Example.hpp" 

bool Example::openFile(const char *inputFile, std::ifstream &s) const 
{ 
    myFile.open(inputFile); 
    return myFile.is_open(); 
} 

#include "Example.hpp" 

Example ex; 
std::ifstream myFile; 

if (ex.openFile("filename", myFile)) 
{ 
    //... 
}