- 论坛徽章:
- 0
|
就是这段代码。GCC 下出现如下问题
125 expected `;' before "ref" ,
也就是在这句 list<T>::const_iterator ref;
但是在VC6。0 VC 2005下都没有问题的。请问是什么原因呢?是不是模板的原因呢?
请各位帮忙解答。谢谢
附件是原代码。
- #include <iostream>
- #include<string.h>
- #include <string>
- #include <list>
- #include <algorithm>
- using namespace std;
- class Patron; // forward declaration;//
- class Book {
- public:
- Book() {
- patron = 0;
- }
- bool operator== (const Book& bk) const {
- return strcmp(title,bk.title) == 0;
- }
- private:
- char *title;
- Patron *patron;
- ostream& printBook(ostream&) const;
- friend ostream& operator<< (ostream& out, const Book& bk) {
- return bk.printBook(out);
- }
- friend class CheckedOutBook;
- friend class Patron;
- friend void includeBook();
- friend void checkOutBook();
- friend void returnBook();
- };
- class Author {
- public:
- Author() {
- }
- bool operator== (const Author& ar) const {
- return strcmp(name,ar.name) == 0;
- }
- private:
- char *name;
- list<Book> books;
- ostream& printAuthor(ostream&) const;
- friend ostream& operator<< (ostream& out,const Author& ar) {
- return ar.printAuthor(out);
- }
- friend void includeBook();
- friend void checkOutBook();
- friend void returnBook();
- friend class CheckedOutBook;
- friend class Patron;
- };
- class CheckedOutBook {
- public:
- CheckedOutBook(list<Author>::iterator ar = 0,
- list<Book>::iterator bk = 0) {
- author = ar;
- book = bk;
- }
- bool operator== (const CheckedOutBook& bk) const {
- return strcmp(author->name,bk.author->name) == 0 &&
- strcmp(book->title,bk.book->title) == 0;
- }
- private:
- list<Author>::iterator author;
- list<Book>::iterator book;
- friend void checkOutBook();
- friend void returnBook();
- friend class Patron;
- };
- class Patron {
- public:
- Patron() {
- }
- bool operator== (const Patron& pn) const {
- return strcmp(name,pn.name) == 0;
- }
- private:
- char *name;
- list<CheckedOutBook> books;
- ostream& printPatron(ostream&) const;
- friend ostream& operator<< (ostream& out, const Patron& pn) {
- return pn.printPatron(out);
- }
- friend void checkOutBook();
- friend void returnBook();
- friend class Book;
- };
- list<Author> catalog['Z'+1];
- list<Patron> people['Z'+1];
- ostream& Author::printAuthor(ostream& out) const {
- out << name << endl;
- list<Book>::const_iterator ref = books.begin();
- for ( ; ref != books.end(); ref++)
- out << *ref; // overloaded <<
- return out;
- }
- ostream& Book::printBook(ostream& out) const {
- out << " * " << title;
- if (patron != 0)
- out << " - checked out to " << patron->name; // overloaded <<
- out << endl;
- return out;
- }
- ostream& Patron::printPatron(ostream& out) const {
- out << name;
- if (!books.empty()) {
- out << " has the following books:\n";
- list<CheckedOutBook>::const_iterator bk = books.begin();
- for ( ; bk != books.end(); bk++)
- out << " * " << bk->author->name << ", "
- << bk->book->title << endl;
- }
- else out << " has no books\n";
- return out;
- }
- template<class T>
- ostream& operator<< (ostream& out, const list<T>& lst) {
- list<T>::const_iterator ref;
- for (ref = lst.begin(); ref != lst.end(); ref++)
- out << *ref; // overloaded <<
- return out;
- }
- char* getString(char *msg) {
- char s[82], i, *destin;
- cout << msg;
- cin.get(s,80);
- while (cin.get(s[81]) && s[81] != '\n'); // discard overflowing
- destin = new char[strlen(s)+1]; // characters;
- for (i = 0; destin[i] = toupper(s[i]); i++);
- return destin;
- }
- void status() {
- register int i;
- cout << "Library has the following books:\n\n";
- for (i = 'A'; i <= 'Z'; i++)
- if (!catalog[i].empty())
- cout << catalog[i];
- cout << "\nThe following people are using the library:\n\n";
- for (i = 'A'; i <= 'Z'; i++)
- if (!people[i].empty())
- cout << people[i];
- }
- void includeBook() {
- Author newAuthor;
- Book newBook;
- newAuthor.name = getString("Enter author's name: ");
- newBook.title = getString("Enter the title of the book: ");
- list<Author>::iterator oldAuthor =
- find(catalog[newAuthor.name[0]].begin(),
- catalog[newAuthor.name[0]].end(),newAuthor);
- if (oldAuthor == catalog[newAuthor.name[0]].end()) {
- newAuthor.books.push_front(newBook);
- catalog[newAuthor.name[0]].push_front(newAuthor);
- }
- else (*oldAuthor).books.push_front(newBook);
- }
- void checkOutBook() {
- Patron patron;
- Author author;
- Book book;
- list<Author>::iterator authorRef;
- list<Book>::iterator bookRef;
- patron.name = getString("Enter patron's name: ");
- while (true) {
- author.name = getString("Enter author's name: ");
- authorRef = find(catalog[author.name[0]].begin(),
- catalog[author.name[0]].end(),author);
- if (authorRef == catalog[author.name[0]].end())
- cout << "Misspelled author's name\n";
- else break;
- }
- while (true) {
- book.title = getString("Enter the title of the book: ");
- bookRef = find((*authorRef).books.begin(),
- (*authorRef).books.end(),book);
- if (bookRef == (*authorRef).books.end())
- cout << "Misspelled title\n";
- else break;
- }
- list<Patron>::iterator patronRef;
- patronRef = find(people[patron.name[0]].begin(),
- people[patron.name[0]].end(),patron);
- CheckedOutBook checkedOutBook(authorRef,bookRef);
- if (patronRef == people[patron.name[0]].end()) { // a new patron
- patron.books.push_front(checkedOutBook); // in the library;
- people[patron.name[0]].push_front(patron);
- (*bookRef).patron = &*people[patron.name[0]].begin();
- }
- else {
- (*patronRef).books.push_front(checkedOutBook);
- (*bookRef).patron = &*patronRef;
- }
- }
- void returnBook() {
- Patron patron;
- Book book;
- Author author;
- list<Patron>::iterator patronRef;
- list<Book>::iterator bookRef;
- list<Author>::iterator authorRef;
- while (true) {
- patron.name = getString("Enter patron's name: ");
- patronRef = find(people[patron.name[0]].begin(),
- people[patron.name[0]].end(),patron);
- if (patronRef == people[patron.name[0]].end())
- cout << "Patron's name misspelled\n";
- else break;
- }
- while (true) {
- author.name = getString("Enter author's name: ");
- authorRef = find(catalog[author.name[0]].begin(),
- catalog[author.name[0]].end(),author);
- if (authorRef == catalog[author.name[0]].end())
- cout << "Misspelled author's name\n";
- else break;
- }
- while (true) {
- book.title = getString("Enter the title of the book: ");
- bookRef = find((*authorRef).books.begin(),
- (*authorRef).books.end(),book);
- if (bookRef == (*authorRef).books.end())
- cout << "Misspelled title\n";
- else break;
- }
- CheckedOutBook checkedOutBook(authorRef,bookRef);
- (*bookRef).patron = 0;
- (*patronRef).books.remove(checkedOutBook);
- }
- int menu() {
- int option;
- cout << "\nEnter one of the following options:\n"
- << "1. Include a book in the catalog\n2. Check out a book\n"
- << "3. Return a book\n4. Status\n5. Exit\n"
- << "Your option? ";
- cin >> option;
- cin.get(); // discard '\n';
- return option;
- }
- int main() {
- while (true)
- switch (menu()) {
- case 1: includeBook(); break;
- case 2: checkOutBook(); break;
- case 3: returnBook(); break;
- case 4: status(); break;
- case 5: return 0;
- default: cout << "Wrong option, try again: ";
- }
- return 0;
- }
复制代码
[ 本帖最后由 nmglzlong 于 2008-7-24 16:43 编辑 ] |
|