Passing istream into a function

c++, ifstream, istream

Solution

You need to pass the stream by reference, because streams are not generally copyable:

void CTeam::ParseTeam(std::istream &in)

Problem

I am making a game-type program similar to the idea of pokemon. We have a tournament class that keeps track of several teams(its own class) which consists of pets(its own class) with different kinds of pets being subclasses of CPet. We are attempting to pass a file name into main, from main pass that file name into the Tournament class. In the Tournament class we open the file with: ``` 14 //Construct a tournament 15 CTournament::CTournament(const char *Filename){ 16 //opening file 17 ifstream inFile(Filename, ios::in); 18 if(inFile.bad()){ 19 cout << "File error" << endl; 20 return ; 21 } 22 //get Teamlist for tournament 23 while(!(inFile.eof())){ 24 CTeam* temp = new CTeam; 25 temp->ParseTeam(inFile); 26 27 TeamList.push_back(temp); 28 } 29 } ``` Here we pass inFile into CTeam.ParseTeam which looks like: ``` 30 void CTeam::ParseTeam(std::istream in){ 31 string readline; 32 getline(in, readline); 33 this->TeamName = readline; 34 while(!(in.eof())&&(readline != " " || readline != "/n")) 35 { 36 getline(in, readline); 37 this->Parse(readline); 38 } 39 } ``` and we are getting the error: ``` In file included from /usr/include/c++/4.4/ios:39, from /usr/include/c++/4.4/ostream:40, from /usr/include/c++/4.4/iostream:40, from CTournament.h:11, from CTournament.cpp:8: /usr/include/c++/4.4/bits/ios_base.h: In copy constructor 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)': /usr/include/c++/4.4/bits/ios_base.h:790: error: 'std::ios_base::ios_base(const std::ios_base&)' is private /usr/include/c++/4.4/iosfwd:47: error: within this context /usr/include/c++/4.4/iosfwd: In copy constructor 'std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)': /usr/include/c++/4.4/iosfwd:53: note: synthesized method 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)' first required here CTournament.cpp: In constructor 'CTournament::CTournament(const char*)': CTournament.cpp:25: note: synthesized method 'std::basic_istream<char, std::char_traits<char> >::basic_istream(const std::basic_istream<char, std::char_traits<char> >&)' first required here CTournament.cpp:25: error: initializing argument 1 of 'void CTeam::ParseTeam(std::istream)' ``` I know there is a similar question about this where he did not include fstream. We have included it in both header files. I thought maybe it was a problem of not passing the correct type into PraseTeam, but I could not find anything very specific on how else to pass the file into ParseTeam to verify whether I was doing it correctly or not. Thanks in advance.

Original source