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

C++ 为什么我的fstream被隐式删除?,c++,class,inheritance,fstream,C++,Class,Inheritance,Fstream,我正在使用一些HID设备,所有这些设备都有从以下基类派生的类(在main.h中): 下面是从中派生的一个设备类(device.h): …以及实施示例: void MyDevice::read(std::fstream file) { // Read from card and write to file response = send_command(READ_DEVICE); file.write((char *)&response[0], response.s

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

下面是从中派生的一个设备类(device.h):

…以及实施示例:

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());
}
…和来电者:

fstream file (filename, ios::binary | ios::in);
dev->read(file);
当我尝试编译时,会出现以下错误:

main.cpp:294:27:错误:使用删除的函数“std::basic\u fstream::basic\u fstream(const std::basic\u fstream&)”
在源/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.\u ZTV13MyDevice[vtable for MyDevice]+0x18):对“MyDevice::write(std::basic\u fstream>&)”的未定义引用


有人能帮我解决这个问题吗?

试着参考一下那些
std::fstream
s

class MyDevice : public HIDDevice {
    public:
        void read(std::fstream&);
        void write(std::fstream&);
};

&std::fstream
作为一个参数,将通过引用传递它,以便在任何地方都用作相同的对象。这避免了实现尝试创建另一个实例,然后在函数结束时关闭流(因为复制的对象正在被销毁)


确保在成员函数的声明和实现中(即在类中和主体所在的位置)都更改了此项。

方法签名意味着
fstream
正在按值传递。这反过来意味着必须使用复制构造函数在调用站点创建原始流对象的副本。正是这个复制构造函数具有规范签名
std::basic\u fstream::basic\u fstream(const std::basic\u fstream&)

编译器告诉您,由于某种原因(与标准库使用的
basic\u fstream
实现的细节有关),它无法自动生成此复制构造函数,因此它无法执行隐式命令来复制流


正如其他人已经说过的,通常的操作方法(在这里也可以防止错误)是通过引用而不是通过值来传递参数。

仅供参考,我有相同的编译器错误,但以不同的方式创建了它,这对我来说并不明显。出于习惯,我写道:

auto stream = fstream(output, iOS::out | iOS::binary);

当然,它会创建一个临时的fstream对象并将其复制到stream。这在Xcode 6中使用了clang,但在GCC 4.9.2中不起作用。

这是我尝试的第一件事,它给了我另一个错误:/main.o:(.rodata._ZTV13MyDevice[vtable for MyDevice]+0x18):未定义对“MyDevice::write(std::basic_fstream&)”的引用。@AndyE:这是一个链接器错误,您是否定义了
void MyDevice::write
并添加了
&
?哦,我定义了
read
,但没有
write
。这就是为什么你永远不应该在晚上10点以后编码。救了我一天。我没有意识到忘记经过reference@AndyE:标题和实现文件中的方法的签名似乎不匹配,或者您忘记定义已声明的方法。顺便说一句,我不知道如何更正它,但问题标题不好:删除的不是流对象,“隐式删除”指的是隐式版本的。@乔恩:也许我们应该离开它,就像其他人使用相似的搜索词一样。不要问我,我不是C++的专家。“关闭”,而不是“删除”,或者更好,“双关闭”。
class MyDevice : public HIDDevice {
    public:
        void read(std::fstream&);
        void write(std::fstream&);
};
auto stream = fstream(output, iOS::out | iOS::binary);