ошибка C2248: 'std :: basic_ios <_Elem, _Traits> :: basic_ios': невозможно получить доступ к закрытому члену, объявленному в классе 'std :: basic_ios <_Elem, _Traits>' - PullRequest
5 голосов
/ 12 июля 2011

Я не могу понять эту ошибку. Эта ошибка не в классе, который я отлаживаю. (Это?) Ошибка:

c:\program files\microsoft visual studio 10.0\vc\include\fstream(890): error    C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\ios(176) : see     declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated   function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
 ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

В чем может быть причина, по которой я получаю эту ошибку?Код слишком длинный для отправки. Используемый мной компилятор Microsoft visual c ++ 2010 express

РЕДАКТИРОВАТЬ:

    void HostelManager::guestMonitor() {
        system("cls");

        cout << "Name of the guest : "; // cin guest
        cin.ignore();
        getline( cin , guestName );

        cout << "\nWhom to meet : ";   // to whom the guest wants to meet
        cin.ignore();
        getline( cin , fullName ); 

        string pathGND = "d:/HostelManager/studentDetails/groundFloor/" + fullName + ".txt";
        string pathFST = "d:/HostelManager/studentDetails/firstFloor/" + fullName + ".txt";
        string pathSND = "d:/HostelManager/studentDetails/firstFloor/" + fullName + ".txt";
        ifstream checkStudentGND( pathGND );
        ifstream checkStudentFST( pathFST );
        ifstream checkStudentSND( pathSND );
        string x = "Floor";

        if( checkStudentGND ) {
            ifstream readRoom( pathGND );
            readRoom >> fullName >> fatherName >> permanentAddress >> postalAddress >> x >> roomNumberToBeAlloted_GND;
            int hisRoomNumber = roomNumberToBeAlloted_GND;
            readRoom.close();
            storeGuestData( hisRoomNumber , fullName );  // call to store guest data
        } else if( checkStudentFST ) {
            ifstream readRoom( checkStudentFST );
            readRoom >> fullName >> fatherName >> permanentAddress >> postalAddress >> x >> roomNumberToBeAlloted_FST;
            int hisRoomNumber = roomNumberToBeAlloted_FST;
            storeGuestData( hisRoomNumber , fullName );  // call to store guest data
        } else if( checkStudentSND ) {
            ifstream readRoom( checkStudentSND );
            readRoom >> fullName >> fatherName >> permanentAddress >> postalAddress >> x >> roomNumberToBeAlloted_SND;
            int hisRoomNumber = roomNumberToBeAlloted_SND;
            storeGuestData( hisRoomNumber , fullName );  // call to store guest data
        } else {
            string sorryMSG = "Sorry ! The student is not in this hostel"                  cout << sorryMSG << endl ;
        }
   }

Вызванная функция:

    void HostelManager::storeGuestData( int hisRoomNumber , string hisName ) {
        cout << "\nVisitor's Address : ";  // cin visitor address
        string visitorAddress;
        getline( cin , visitorAddress );

        cout << "\nRelation with the student : ";   // cin relation with student
        string relation;
        getline( cin , relation );

        cout << "\nEnter Month";    // cin enter month
        short month;
        cin >> month;

        cout << "\nEnter Date";    // cin enter date
        short date;
        cin >> date;

        cout << "\nYou can meet " << hisName << " in room number " << hisRoomNumber << endl ;

        string visitorPath = "d:/HostelManager/GuestMonitor/" + fullName + ".txt" ;
        ofstream guestEntry( visitorPath );
        guestEntry << "Name of Visitor : " << guestName << endl ;
        guestEntry << "To meet : " << fullName << endl ;
        guestEntry << "Address of visitor : " << visitorAddress << endl ;
        guestEntry << "Relation with the student : " << relation << endl ;
        guestEntry << "Month : " << month << endl ;
        guestEntry << "Date : " << date << endl ; 
        guestEntry.close();
        cout << "\n\n\n\nData successfully inserted";
    }

Участники данных:

    private:
        string fullName;
        string fatherName;
        string permanentAddress;
        string postalAddress;
        int mobileNumbers[2][10];
        double percentageMarks;
        int roomNumber;
        int roomNumberToBeAlloted_GND ;
        int roomNumberToBeAlloted_FST ;
        int roomNumberToBeAlloted_SND ;
        string preferredFloor;
        string guestName;
        string studentFined;
        string complaintAgainst;
        string receiverOfEmail;
        string senderOfEmail;
        string subject;

    public:
        void guestMonitor();
        void storeGuestData( int hisRoomNumber , string hisName );

Ответы [ 4 ]

13 голосов
/ 12 июля 2011

Вы пытаетесь скопировать поток, что невозможно.

Чтобы избежать этого, у одного из базовых классов есть конструктор личных копий.

3 голосов
/ 12 июля 2011

Неправильные строки:

ifstream readRoom( checkStudentFST ); 

и

ifstream readRoom( checkStudentSND );  

, где вы пытаетесь скопировать существующий поток, а не открывать его с именем файла.

0 голосов
/ 08 июня 2016

Проблема может возникнуть, если вы задаете параметр класса (который создает копию объекта) в конструкторе, например:

class Test
{
public:
    Test() {}
    Test(FileHandler fh_) : fh(fh_) {}
    // ...
private:
    FileHandler fh;
};

Если класс FileHandler содержит член, которыйэто поток файлов, вы получите ошибку, как и я.

РЕШЕНИЕ: Изменение параметра конструктора с FileHandler fh_ на FileHandler* fh_.

0 голосов
/ 12 июля 2011

Из вашей ошибки я могу предположить, что вы пытаетесь перегрузить operator << или operator >> с помощью fstream (или ostream) для вашего собственного class объекта.

Каким-то образомВы упустили упоминание, что operator << функционирует как друг вашего class.Ваш код должен выглядеть как этот фрагмент .Внимательно проследите, чтобы члены данных были сделаны public для цели class.

...