私有std :: fstream成员无法访问?

时间:2014-10-21 13:50:45

标签: c++ private fstream ifstream ofstream

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

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。

1 个答案:

答案 0 :(得分:1)

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

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

<强>更新

  

f没有为类类型提供用户定义的副本构造函数   (struct,class或union),编译器将始终声明一个副本   构造函数作为其类的内联公共成员。

From cpp reference

因此,即使您没有复制队列对象,编译器也会生成复制构造函数。而且这个构造函数不能复制std :: fstream对象。