I am unable to understand this error.This error is not in the class that i am debugging . (Is it ?) The error is :
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 ==========
What could be the reasons i am getting this error ? The code is too lengthy to post. The compiler that i am using is Microsoft visual c++ 2010 express
EDIT:
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 ;
}
}
The called function:
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";
}
Data Members:
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 );
You are trying to copy a stream, which is not possible.
To help you avoid that, one of the base classes has a private copy constructor.
The offending lines are,
ifstream readRoom( checkStudentFST );
and,
ifstream readRoom( checkStudentSND );
where you are trying to copy an existing stream, instead of perhaps opening it with the file name.
From your error, I can make a guess that you are trying to overload operator << or operator >> with fstream (or ostream) for your own class object.
Somehow you have missed to mention that operator << function as friend of your class. Your code should be looking like this snippet. See in carefully that data members are made public for the target class.
The problem can occur if You are setting a class parameter (which is making a copy of the object) in a constructor, like this:
class Test
{
public:
Test() {}
Test(FileHandler fh_) : fh(fh_) {}
// ...
private:
FileHandler fh;
};
If the FileHandler class contains a member which is a file stream, You will get the error, just as I did.
SOLUTION: Changing the constructor parameter from FileHandler fh_ to FileHandler* fh_.
来源:https://stackoverflow.com/questions/6661257/error-c2248-stdbasic-ios-elem-traitsbasic-ios-cannot-access-private