La fonction ne peut pas être référencée comme il est supprimé de la fonction
Bonjour, je suis en train d'apprendre le C++ à partir d'un livre et je suis sur un exercice en question ci-dessous
Écrire une fonction qui prend en entrée et retourne un istream&. La fonction doit lire le flux jusqu'à ce qu'il frappe de fin de fichier. La fonction d'impression de ce qu'il lit sur la sortie standard. Réinitialiser le flux de sorte qu'il est valide avant de renvoyer le flux de données.
#include "stdafx.h"
#include <iostream>
#include <istream>
#include <string>
#include <string.h>
#include <list>
#include <vector>
#include <fstream>
std::istream ReadFile(std::istream &iStream)
{
std::string word;
while (iStream >> word)
{}
std::cout << "I read value " << word << std::endl;
iStream.setstate(std::ios::goodbit);
return iStream;
}
int _tmain(int argc, _TCHAR* argv[])
{
ReadFile(std::cin);
system("pause");
return 0;
}
Ci-dessus est une tentative de ma part, mais j'ai des erreurs au "retour iStream" de ligne.
Error1 error C2280: 'std::basic_istream<char,std::char_traits<char>>::basic_istream(const std::basic_istream<char,std::char_traits<char>> &)' : attempting to reference a deleted function
2 IntelliSense: function "std::basic_istream<_Elem, _Traits>::basic_istream(const std::basic_istream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 77 of "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\istream") cannot be referenced -- it is a deleted function
Je ne sais pas vraiment ce que ces erreurs sont, j'en suis conscient, vous pouvez supprimer des choses, mais je ne suis pas sur ce sujet dans le livre encore. Pour autant que je sais que je n'ai pas du tout touché à la istream fichier... quelqu'un Peut m'aider s'il vous plaît?
Merci!
ReadFile
doit retourner std::istream &
- et iStream.clear()
plutôt que iStream.setstate(std::ios::goodbit)
J'ai eu cette erreur lors du portage d'un projet Visual Studio 2015 UWP app. J'ai ajouté un constructeur de copie de la classe à laquelle il se plaint, et le problème est résolu.
OriginalL'auteur Foysal94 | 2014-09-13
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas retourner un
istream
par la valeur, car il n'est pas copiable.Puisqu'il n'est pas copiable le constructeur de copie a été supprimé (pour faire respecter la non-copyability), et c'est la technique directe de la cause du diagnostic.
Ainsi, au lieu de
... ne
Dans d'autres nouvelles, ...
Au lieu de
tout simplement désactiver les en-têtes précompilés dans les paramètres de projet Visual Studio.
Cela vous donne également plus standard conforme comportement d'en-tête des inclusions.
Si vous ne le faites pas, alors configurer le projet pour qu'aucun avertissement en sautant d'une inclure, donne une dur d'erreur de compilation.
Au lieu de
... ne
Au lieu de la non-portable Microsoft monstruosité
suffit d'utiliser la norme
ou en C++11 de fuite type de retour de la syntaxe,
Au lieu de
simplement exécuter votre programme à l'aide de Ctrl+F5 dans Visual Studio. Sinon, placez un point d'arrêt sur la dernière accolade fermante de
main
et exécuté dans le débogueur. Ou, exécutez le programme à partir de la ligne de commande.L'exercice de formulation
est ambigu, mais de toute façon la lecture mots, comme vous le faites, ne permet pas de reproduire fidèlement les espaces dans le flux. Pour une reproduction précise des flux de contenu que vous pouvez lire caractère par caractère, (ou via
getline
) ligne en ligne. Ou, vous pouvez utiliser un mécanisme spécial pour cette tâche, à savoir la sortie de la mémoire tampon de lecture, qui ne tout dans un peu d'instruction.Enfin, vous n'avez pas besoin de toutes ces en-têtes. Vous avez seulement besoin
<iostream>
, et si vous choisissez de lire des lignes, aussi<string>
. Aussi, vous n'avez pas besoin de lareturn 0;
à la fin demain
, parce que c'est la valeur par défaut.la syntaxe de déclaration d'un nom de référence commence par Type
&
nom. Vous pouvez mettre ce queType& name
ouType &name
. En C++, avec son accent sur le typage fort,Type&
est naturel, tandis que dans la variable orientée C (si C avait références, dont il n'a pas!)&name
, comme vous l'aviez écrit, serait plus naturel. La dernière méthode, la rend plus claire de ce qu'est une déclaration auprès de plusieurs noms, moyen, important en C. En C++, il faut juste éviter les déclarations de multiples noms.concernant la lecture de mots, si, comme la preuve d'un peu implique, le but est de reproduire le flux de contenu, puis de la lecture de mots ne peut pas vous dire comment beaucoup d'espaces entre les mots, comme les espaces, tabulations, retours à la ligne, donc ça ne peut pas être reproduit. Notez cependant que dans Windows uniquement purement textuelle diffuser du contenu peut être reproduite fidèlement par une simple standard C++ programme, même lors de la lecture de l'octet par octet, parce que texte, fait des ravages avec des fins de ligne et 26 ASCII (Ctrl Z), qui pour Windows texte est interprété comme la fin du fichier.
OriginalL'auteur
Un supprimé la fonction est une fonction spéciale (constructeur, destructeur de l'opérateur) qui a été explicitement désactivée. Si vous regardez attentivement, à l'erreur, vous pouvez voir que la fonction est la
basic_istream
constructeur par copie, qui est désactivé car istreams ne peuvent pas être copiés. Vous essayez de copier le istream lorsque vousreturn istream
, depuis votre fonction est déclarée comme au retour d'uneistream
(plutôt que, par exemple, renvoie une référence à unistream
).OriginalL'auteur