Pourquoi mon fstream être supprimés de manière implicite?
Je travaille avec quelques périphériques HID, qui ont tous des classes dérivant de la suite de la classe de base (en principal.h):
class HIDDevice {
public:
hid_device *device;
virtual void read(std::fstream)=0;
virtual void write(std::fstream)=0;
};
Voici un appareil de classes qui en dérivent (appareil.h):
class MyDevice : public HIDDevice {
public:
void read(std::fstream);
void write(std::fstream);
};
...et un exemple de mise en œuvre:
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());
}
...et l'appelant:
fstream file (filename, ios::binary | ios::in);
dev->read(file);
Quand j'essaie de le compiler, j'obtiens l'erreur suivante:
principal.rpc:294:27: erreur: l'utilisation de supprimé la fonction ‘std::basic_fstream::basic_fstream(const std::basic_fstream&)’
Dans le fichier inclus à partir de la source principale.rpc:24:0:
/usr/include/c++/4.6/fstream:761:11: erreur: ‘std::basic_fstream::basic_fstream(const std::basic_fstream&)’ est implicitement supprimé parce que la définition par défaut serait mal formé:
... et je n'ai aucune idée pourquoi, sans doute parce que je suis assez novice en C++ et j'ai fait quelque chose d'idiot.
Changer les arguments retour aux références (à l'aide de &), j'obtiens l'erreur suivante:
/main.o:(.rodata._ZTV13MyDevice[vtable pour mon périphérique]+0x18): undefined reference to `MyDevice::write(std::basic_fstream >&)'
Quelqu'un peut-il m'aider à résoudre ce problème?
peut-être que nous devrions le laisser comme cela est dans le cas où quelqu'un d'autre utilise le même genre de termes de recherche? Ne me demandez pas, cependant, je ne suis pas un expert en C++.
"fermé" plutôt que "supprimé" peut-être? Ou mieux encore, "double-fermé". Entre ça et la question du corps, je pense que votre couvert.
OriginalL'auteur Andy E | 2012-09-14
Vous devez vous connecter pour publier un commentaire.
Essayer de lancer ces
std::fstream
s autour par référence.C'est une erreur de l'éditeur de liens, avez-vous définir
void MyDevice::write
et ajouter un&
?Oh pinaise, j'ai défini
read
, mais paswrite
. C'est pourquoi vous ne devez jamais de code après 10 heures du soir.Sauvé ma journée. Je ne savais pas oublier de passer par référence
OriginalL'auteur WhozCraig
Juste pour la référence, j'ai eu la même erreur de compilation, mais l'a créé d'une manière différente de ce qui n'était pas immédiatement évident pour moi. Par habitude, j'ai écrit:
Qui, bien sûr, crée un temporaire fstream objet et la copie de flux. Qui a travaillé dans Xcode 6 à l'aide de bruit, mais pas pour GCC 4.9.2.
OriginalL'auteur Aaron Burghardt
La
HIDDevice
signatures de méthode signifie que lefstream
s sont passés par valeur. Cela signifie que des copies de l'original stream objets doivent être créés sur le site d'appel à l'aide du constructeur de copie. C'est ce constructeur de copie qui a la forme canonique de la signaturestd::basic_fstream::basic_fstream(const std::basic_fstream&)
.Le compilateur est vous dire que pour une raison quelconque (ce qui a à voir avec les particularités de la
basic_fstream
de mise en œuvre de votre bibliothèque standard utilise), il ne peut pas générer automatiquement ce constructeur de copie, donc il ne peut pas répondre à votre implicite de commande pour faire des copies de flux.Comme d'autres l'ont déjà dit, l'habitude de modus operandi (ce qui permettra également d'éviter l'erreur ici) est de passer les arguments par référence et non par valeur.
On dirait les signatures des méthodes dans les en-têtes et dans la mise en œuvre de fichier ne correspondent pas, ou vous avez oublié de définir une méthode qui a été déclaré.
OriginalL'auteur Jon
&std::fstream
comme un paramètre de les passer par référence à utiliser comme l'objet même partout. Cela permet d'éviter la mise en œuvre d'essayer de créer une autre instance puis la fermeture du flux lorsque les fonctions à la fin (parce que l'objet copié est en train d'être détruits).Assurez-vous de changer à la fois la déclaration et la mise en œuvre de la fonction de membre (c'est à dire dans la classe et où le corps est).
OriginalL'auteur Jonathan Seng