为什么无法访问?我根本无法理解这个错误。它非常模糊,编译器解释得很差。
Error 1 error C2248: 'std::basic_fstream<_Elem,_Traits>::basic_fstream' : cannot
access private member declared in class 'std::basic_fstream<_Elem,_Traits>' c:\users
\user\documents\visual studio 2012\projects\queue\queue\main.cpp 69 1 queue
第69行只包含一个带分号的右括号。
class queue {
public:
queue() {
back = NULL;
front = NULL;
}
void setfile(const char* to) {
file.open(to, std::fstream::in | std::fstream::out | std::fstream::app);
}
void push(const char* msg) {
file << msg << QueryPerformanceCounter(&nano::end);
if(front == NULL) {
back = new item(msg);
front = back;
}
else {
back->setprev(new item(msg));
back = back->getprev();
}
}
void* pop(const char* msg) {
file << msg << QueryPerformanceCounter(&nano::end);
if(front == NULL) {
return false;
}
else {
item* temp = front;
front = front->getprev();
delete temp;
}
}
private:
std::fstream file;
item* back;
item* front;
};
类定义末尾的最后一个大括号是错误指向的地方。你可能想知道我是否试图分配或复制私人std :: fstream对象,但我还没有。使用它的所有代码都在类定义中内联。 setfile()函数是唯一一个从外部与它交互的代码,它所采用的常量字符参数只是文件名。
目前使用MSVC ++ 2012。
答案 0 :(得分:1)
std :: fstream没有公共拷贝构造函数或赋值运算符。因此,队列类的隐式生成的复制构造函数不能复制文件对象。
首先,您可以通过显式声明私有拷贝构造函数来拒绝复制队列对象。 第二种解决方案是通过指针而不是值来包含您的fstream。要防止出现内存问题,请使用shared_ptr而不是简单的指针。
<强>更新强> 我
f没有为类类型提供用户定义的副本构造函数 (struct,class或union),编译器将始终声明一个副本 构造函数作为其类的内联公共成员。
因此,即使您没有复制队列对象,编译器也会生成复制构造函数。而且这个构造函数不能复制std :: fstream对象。