文件 I/O 错误复制构造函数 C++

File I/O error Copy Constructor 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

这个是程序中其他子类实现的,以后用得着。但是,就目前而言,当我尝试构建它时,它 returns 我遇到了这些错误:

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

我想弄清楚我在这里做错了什么。它与包含有关吗?是不是打错了我没看出来

提前致谢。

您正在尝试 return 流按值。这在 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))
{
   //...
}