gpt4 book ai didi

c++ - 无法访问私有(private) std::fstream 成员?

转载 作者:行者123 更新时间:2023-11-28 06:37:56 25 4
gpt4 key购买 nike

为什么无法访问?我根本无法理解这个错误。它非常模糊,编译器解释得很差。

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;
};

类定义末尾的最后一个大括号是错误指向我的地方。您可能想知道我是否尝试过分配或复制私有(private) std::fstream 对象,但我没有。使用它的所有代码都内嵌在类定义中。 setfile() 函数是唯一从外部与其交互的代码,它采用的常量字符参数只是文件名。

目前使用 MSVC++ 2012。

最佳答案

std::fstream 没有公共(public)复制构造函数或赋值运算符。因此队列类隐式生成的复制构造函数不能复制文件对象。

首先,您可以通过显式声明私有(private)复制构造函数来拒绝复制队列对象。第二种解决方案是通过指针而不是值来包含您的 fstream。为防止内存问题,请使用 shared_ptr 而不是简单的指针。

更新

f no user-defined copy constructors are provided for a class type (struct, class, or union), the compiler will always declare a copy constructor as an inline public member of its class.

From cpp reference

因此,即使您不复制队列对象,编译器仍会生成复制构造函数。并且此构造函数无法复制 std::fstream 对象。

关于c++ - 无法访问私有(private) std::fstream 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26488381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com