web-dev-qa-db-fra.com

tentative de référence à une fonction supprimée

J'essaie d'en apprendre davantage sur la classe faîtière et j'ai des problèmes. J'ai créé quelques fichiers txt, l'un avec une blague et l'autre avec un punchline (joke.txt) et (punchline.txt) juste pour lire et afficher du contenu. Je demande à l'utilisateur le nom du fichier et, s'il est trouvé, il devrait l'ouvrir, effacer les drapeaux, puis lire le contenu. Mais je ne peux même pas vérifier ce qu'il lit car je reçois actuellement des erreurs concernant une fonction supprimée, mais je ne le fais pas. t sais ce que cela signifie

erreur 1:

"IntelliSense: function "std::basic_ifstream<_Elem, _Traits>::basic_ifstream(const std::basic_ifstream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 818 of "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\fstream") cannot be referenced -- it is a deleted function

la deuxième erreur est exactement la même, mais pour la deuxième fonction (displayLastLine ())

et erreur 3:

Error   1   error C2280: 'std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &)' : attempting to reference a deleted function

et voici mon code:

#include "stdafx.h" 
#include <string>    
#include <iostream>  
#include <fstream>   

using namespace std; 

void displayAllLines(ifstream joke);
void displayLastLine(ifstream punchline);

 int main()          
{
    string fileName1, fileName2;
    ifstream jokeFile, punchlineFile;


    // Desribe the assigned project to the User
    cout << "This program will print a joke and its punch line.\n\n";

    cout << "Enter the name of the joke file (ex. joke.txt): ";
    cin  >> fileName1;
    jokeFile.open(fileName1.data());  
    if (!jokeFile)
    {
        cout << "  The file " << fileName1 << " could not be opened." << endl;
    }

    else
    {   
        cout << "Enter name of punch line file (ex. punchline.txt): ";
        cin  >> fileName2;
        punchlineFile.open(fileName2.data());  
        if (!punchlineFile)
        {
            cout << "  The file " << fileName2 << " could not be opened." << endl;
            jokeFile.close();
        }

        else
        {   
            cout << endl << endl; 

            displayAllLines(jokeFile);

            displayLastLine(punchlineFile); 
            cout << endl;

            jokeFile.close();
            punchlineFile.close();
        }
    }


    // This prevents the Console Window from closing during debug mode
    cin.ignore(cin.rdbuf()->in_avail());
    cout << "\nPress only the 'Enter' key to exit program: ";
    cin.get();

    return 0;
}
 void displayAllLines(ifstream joke)
 {
     joke.clear();
     joke.seekg(0L, ios::beg);
     string jokeString;
     getline(joke, jokeString);
     while (!joke.fail())
     {
         cout << jokeString << endl;
     }
 }
 void displayLastLine(ifstream punchline)
 {
     punchline.clear();
     punchline.seekg(0L, ios::end);
     string punchString;
     getline(punchline, punchString);
     while (!punchline.fail())
     {
         cout << punchString << endl;
     }
 }
19
jacksonSD

Vous appelez une fonction supprimée, qui est le constructeur de copie de la classe std::ifstream.

Si vous regardez la référence vous remarquez que le constructeur de copie n'est pas autorisé.

alors au lieu d'utiliser:

void displayAllLines(ifstream joke);
void displayLastLine(ifstream punchline);

vous devriez travailler avec les appels par référence:

void displayAllLines(ifstream& joke);
void displayLastLine(ifstream& punchline);

Utiliser une référence se comportera comme si vous appeliez la méthode avec une copie, mais en réalité, vous utilisez l'objet original au lieu d'un nouvel objet construit en copie. N'oubliez pas cela pour une utilisation ultérieure de l'appel par référence.

37
Theolodis

En ce qui concerne les réponses précédentes passe par référence au lieu de valeur, n'oubliez pas que toute modification de la variable dans les fonctions définies affecte également la variable déclarée d'origine (dans le main ()).

0
msarafzadeh