Доброго всем времени суток!!! Прошу помочь разобраться с ошибкой... Дейтелы "Как программировать на С++" Пример реализации очереди ListNode.h Код | // Fig. 20.3: ListNode.h // Template ListNode class definition. #ifndef LISTNODE_H #define LISTNODE_H
// forward declaration of class List required to announce that class // List exists so it can be used in the friend declaration at line 13 template< typename NODETYPE > class List;
template< typename NODETYPE > class ListNode { friend class List< NODETYPE >; // make List a friend
public: ListNode( const NODETYPE & ); // constructor NODETYPE getData() const; // return data in node private: NODETYPE data; // data ListNode< NODETYPE > *nextPtr; // next node in list }; // end class ListNode
// constructor template< typename NODETYPE > ListNode< NODETYPE >::ListNode( const NODETYPE &info ) : data( info ), nextPtr( 0 ) { // empty body } // end ListNode constructor
// return copy of data in node template< typename NODETYPE > NODETYPE ListNode< NODETYPE >::getData() const { return data; } // end function getData
#endif
|
List.h Код | // Fig. 20.4: List.h // Template List class definition. #ifndef LIST_H #define LIST_H
#include <iostream> using std::cout;
#include <new> #include "ListNode.h" // ListNode class definition
template< typename NODETYPE > class List { public: List(); // constructor ~List(); // destructor void insertAtFront( const NODETYPE & ); void insertAtBack( const NODETYPE & ); bool removeFromFront( NODETYPE & ); bool removeFromBack( NODETYPE & ); bool isEmpty() const; void print() const; private: ListNode< NODETYPE > *firstPtr; // pointer to first node ListNode< NODETYPE > *lastPtr; // pointer to last node
// utility function to allocate new node ListNode< NODETYPE > *getNewNode( const NODETYPE & ); }; // end class List
// default constructor template< typename NODETYPE > List< NODETYPE >::List() : firstPtr( 0 ), lastPtr( 0 ) { // empty body } // end List constructor
// destructor template< typename NODETYPE > List< NODETYPE >::~List() { if ( !isEmpty() ) // List is not empty { cout << "Destroying nodes ...\n";
ListNode< NODETYPE > *currentPtr = firstPtr; ListNode< NODETYPE > *tempPtr;
while ( currentPtr != 0 ) // delete remaining nodes { tempPtr = currentPtr; cout << tempPtr->data << '\n'; currentPtr = currentPtr->nextPtr; delete tempPtr; } // end while } // end if
cout << "All nodes destroyed\n\n"; } // end List destructor
// insert node at front of list template< typename NODETYPE > void List< NODETYPE >::insertAtFront( const NODETYPE &value ) { ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
if ( isEmpty() ) // List is empty firstPtr = lastPtr = newPtr; // new list has only one node else // List is not empty { newPtr->nextPtr = firstPtr; // point new node to previous 1st node firstPtr = newPtr; // aim firstPtr at new node } // end else } // end function insertAtFront
// insert node at back of list template< typename NODETYPE > void List< NODETYPE >::insertAtBack( const NODETYPE &value ) { ListNode< NODETYPE > *newPtr = getNewNode( value ); // new node
if ( isEmpty() ) // List is empty firstPtr = lastPtr = newPtr; // new list has only one node else // List is not empty { lastPtr->nextPtr = newPtr; // update previous last node lastPtr = newPtr; // new last node } // end else } // end function insertAtBack
// delete node from front of list template< typename NODETYPE > bool List< NODETYPE >::removeFromFront( NODETYPE &value ) { if ( isEmpty() ) // List is empty return false; // delete unsuccessful else { ListNode< NODETYPE > *tempPtr = firstPtr; // hold tempPtr to delete
if ( firstPtr == lastPtr ) firstPtr = lastPtr = 0; // no nodes remain after removal else firstPtr = firstPtr->nextPtr; // point to previous 2nd node
value = tempPtr->data; // return data being removed delete tempPtr; // reclaim previous front node return true; // delete successful } // end else } // end function removeFromFront
// delete node from back of list template< typename NODETYPE > bool List< NODETYPE >::removeFromBack( NODETYPE &value ) { if ( isEmpty() ) // List is empty return false; // delete unsuccessful else { ListNode< NODETYPE > *tempPtr = lastPtr; // hold tempPtr to delete
if ( firstPtr == lastPtr ) // List has one element firstPtr = lastPtr = 0; // no nodes remain after removal else { ListNode< NODETYPE > *currentPtr = firstPtr;
// locate second-to-last element while ( currentPtr->nextPtr != lastPtr ) currentPtr = currentPtr->nextPtr; // move to next node
lastPtr = currentPtr; // remove last node currentPtr->nextPtr = 0; // this is now the last node } // end else
value = tempPtr->data; // return value from old last node delete tempPtr; // reclaim former last node return true; // delete successful } // end else } // end function removeFromBack
// is List empty? template< typename NODETYPE > bool List< NODETYPE >::isEmpty() const { return firstPtr == 0; } // end function isEmpty
// return pointer to newly allocated node template< typename NODETYPE > ListNode< NODETYPE > *List< NODETYPE >::getNewNode( const NODETYPE &value ) { return new ListNode< NODETYPE >( value ); } // end function getNewNode
// display contents of List template< typename NODETYPE > void List< NODETYPE >::print() const { if ( isEmpty() ) // List is empty { cout << "The list is empty\n\n"; return; } // end if
ListNode< NODETYPE > *currentPtr = firstPtr;
cout << "The list is: ";
while ( currentPtr != 0 ) // get element data { cout << currentPtr->data << ' '; currentPtr = currentPtr->nextPtr; } // end while
cout << "\n\n"; } // end function print
#endif
|
Queue.h Код | // Fig. 20.16: Queue.h // Template Queue class definition derived from class List. #ifndef QUEUE_H #define QUEUE_H
#include "List.h" // List class definition
template< typename QUEUETYPE > class Queue: private List< QUEUETYPE > { public: // enqueue calls List member function insertAtBack void enqueue( const QUEUETYPE &data ) { insertAtBack( data ); } // end function enqueue
// dequeue calls List member function removeFromFront bool dequeue( QUEUETYPE &data ) { return removeFromFront( data ); } // end function dequeue
// isQueueEmpty calls List member function isEmpty bool isQueueEmpty() const { return isEmpty(); } // end function isQueueEmpty
// printQueue calls List member function print void printQueue() const { print(); } // end function printQueue }; // end class Queue
#endif
|
Fig20_17.cpp Код | // Fig. 20.17: Fig20_17.cpp // Template Queue class test program. #include <iostream> using std::cout; using std::endl;
#include "Queue.h" // Queue class definition
int main() { Queue< int > intQueue; // create Queue of integers
cout << "processing an integer Queue" << endl;
// enqueue integers onto intQueue for ( int i = 0; i < 3; i++ ) { intQueue.enqueue( i ); intQueue.printQueue(); } // end for
int dequeueInteger; // store dequeued integer
// dequeue integers from intQueue while ( !intQueue.isQueueEmpty() ) { intQueue.dequeue( dequeueInteger ); cout << dequeueInteger << " dequeued" << endl; intQueue.printQueue(); } // end while
Queue< double > doubleQueue; // create Queue of doubles double value = 1.1;
cout << "processing a double Queue" << endl;
// enqueue floating-point values onto doubleQueue for ( int j = 0; j < 3; j++ ) { doubleQueue.enqueue( value ); doubleQueue.printQueue(); value += 1.1; } // end for
double dequeueDouble; // store dequeued double
// dequeue floating-point values from doubleQueue while ( !doubleQueue.isQueueEmpty() ) { doubleQueue.dequeue( dequeueDouble ); cout << dequeueDouble << " dequeued" << endl; doubleQueue.printQueue(); } // end while
return 0; } // end main
|
Цитата | Queue.h||In member function `bool Queue<QUEUETYPE>::isQueueEmpty() const':| Queue.h|27|error: there are no arguments to `isEmpty' that depend on a template parameter, so a declaration of `isEmpty' must be available| Queue.h|27|error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)| Queue.h||In member function `void Queue<QUEUETYPE>::printQueue() const':| Queue.h|33|error: there are no arguments to `print' that depend on a template parameter, so a declaration of `print' must be available| ||=== Build finished: 3 errors, 0 warnings ===|
|
IDE: Code::Blocks 8.02 Compiler: GNU GCC compiler Ошибка в коде или причуды компилятора? Как заставить работать? Благодарю за помощь.
|