我试图在头文件中声明一个ifstream对象,如图所示,但我得到一个错误,说它无法访问.我尝试了各种各样的东西,比如把它变成指针,在.c文件中初始化等等,但是我的代码似乎无法获得它的声明.
ReadFile.h:
#ifndef READFILE_H #define READFILE_H #include "cv.h" #include "highgui.h" #include#include class ReadFile{ private: std::ifstream stream; public: std::string read(); ReadFile(); // Default constructor ~ReadFile(); // Destructor }; #endif
ReadFile.c:#include"ReadFile.h"
ReadFile::ReadFile(){ stream.open("./data.txt"); } ReadFile::~ReadFile(){ stream.close(); }
我得到的错误是:
Error 9 error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>' c:\users\Bob\documents\project\models\readfile.h 23 1 Project
输出是:
1>c:\users\Bob\documents\project\models\readfile.h(23): error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits1> ] 1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\fstream(827) : see declaration of 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits 1> ] 1> This diagnostic occurred in the compiler generated function 'ReadFile::ReadFile(const ReadFile &)'
std::ifstream stream;
包含时会发生错误,删除此行时会消失.可能导致此错误的原因是什么?我错过了一些非常明显的东西,还是有更多的东西?
问题是std::ifstream
没有公共拷贝构造函数(因为复制一个没有意义)但是你的类的编译器生成的拷贝构造函数想要使用它.
由于同样的原因,它没有任何可用的赋值运算符(即复制a std::ifstream
是无意义的).
您也应该禁止为您的班级复制和分配.
一种简单的方法是添加
private: ReadFile(const ReadFile&); ReadFile& operator=(const ReadFile&);
如果您正在使用C++ 03,请到您的班级.
在C++ 11中,使用= delete
语法.
public: ReadFile(const ReadFile&) = delete; ReadFile& operator=(const ReadFile&) = delete;