问题
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 );
回答1:
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.
回答2:
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.
回答3:
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
.
回答4:
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