Почему мой fstream неявно удаляется?

Я работаю с несколькими устройствами HID, у всех из которых есть классы, производные от следующего базового класса (в main.h):

class HIDDevice {
public:
hid_device *device;

virtual void read(std::fstream)=0;
virtual void write(std::fstream)=0;
};

Вот один из классов устройств, производных от него (device.h):

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

…и образец реализации:

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_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 для MyDevice] + 0x18): неопределенная ссылка на `MyDevice :: write (std :: basic_fstream>&)»

Может кто-нибудь помочь мне решить эту проблему?

9

Решение

Попробуйте бросить те std::fstreamвокруг ссылки.

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

Другие решения

Просто для справки, у меня была та же ошибка компилятора, но я создал ее другим способом, который не был сразу очевиден для меня. По привычке я написал:

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

Который, конечно, создает временный объект fstream и копирует его в поток. Это работало в Xcode 6 с использованием clang, но не для GCC 4.9.2.

4

HIDDevice подписи метода означают, что fstreamS передаются по значению. Это, в свою очередь, означает, что копии исходных потоковых объектов должны создаваться на сайте вызова с использованием конструктора копирования. Именно этот конструктор копирования имеет каноническую подпись std::basic_fstream::basic_fstream(const std::basic_fstream&),

Компилятор говорит вам, что по какой-то причине (что связано с подробностями basic_fstream реализация, которую использует ваша стандартная библиотека), она не может автоматически сгенерировать этот конструктор копирования, следовательно, она не может выполнить вашу неявную команду для создания копий потоков.

Как уже говорили другие, обычным способом действия (который также предотвратит ошибку здесь) является передача аргументов по ссылке, а не по значению.

2

&std::fstream в качестве параметра он будет передаваться по ссылке, чтобы использоваться везде как один и тот же объект. Это позволяет избежать реализации, пытающейся создать другой экземпляр, а затем закрыть поток, когда функции заканчиваются (потому что копируемый объект разрушается).

Убедитесь, что вы изменили это как в объявлении, так и в реализации функции-члена (то есть в классе и в том месте, где находится тело).

1
По вопросам рекламы [email protected]