为什么我的fstream被隐式删除?

And*_*y E 10 c++ inheritance fstream class

我正在使用一些HID设备,所有这些设备都有从以下基类派生的类(在main.h中):

class HIDDevice {
    public:
        hid_device *device;

        virtual void read(std::fstream)=0;
        virtual void write(std::fstream)=0;
};
Run Code Online (Sandbox Code Playgroud)

这是从它派生的设备类之一(device.h):

class MyDevice : public HIDDevice {
    public:
        void read(std::fstream);
        void write(std::fstream);
};
Run Code Online (Sandbox Code Playgroud)

......以及实施的样本:

void MyDevice::read(std::fstream file) {
    // Read from card and write to file
    response = send_command(READ_DEVICE);
    file.write((char *)&response[0], response.size());
}
Run Code Online (Sandbox Code Playgroud)

......和来电者:

fstream file (filename, ios::binary | ios::in);
dev->read(file);
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我收到以下错误:

main.cpp:294:27:错误:使用已删除的函数'std :: basic_fstream :: basic_fstream(const std :: basic_fstream&)'
在source/main.cpp中包含的文件中:24:0:/ usr/include/c ++ /4.6/fstream:761:11:错误:'std :: basic_fstream :: basic_fstream(const std :: basic_fstream&)'被隐式删除,因为默认定义不正确:

......我不知道为什么,可能是因为我对C++很新,我做了一些愚蠢的事情.

将参数更改回引用(使用&),我收到以下错误:

/main.o:(.rodata._ZTV13MyDevice[vtable for MyDevice] + 0x18):未定义的引用`MyDevice :: write(std :: basic_fstream>&)'

任何人都可以帮我解决这个问题吗?

Who*_*aig 20

尝试std::fstream通过引用折腾这些.

class MyDevice : public HIDDevice {
    public:
        void read(std::fstream&);
        void write(std::fstream&);
};
Run Code Online (Sandbox Code Playgroud)


小智 5

仅供参考,我遇到了相同的编译器错误,但以不同的方式创建了该错误,这对我来说并不是立即显而易见的。我出于习惯写了:

auto stream = fstream(output, iOS::out | iOS::binary);
Run Code Online (Sandbox Code Playgroud)

当然,这会创建一个临时的fstream对象并将其复制到流中。使用clang在Xcode 6中有效,但不适用于GCC 4.9.2。