<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2" -->
<rss version="2.0">
    <channel>
        <title>Lowyat.NET: Latest topics by tud09</title>
        <description></description>
        <link>http://forum.lowyat.net/</link>
        <lastBuildDate>Mon, 06 Jul 2026 18:52:05 +0800</lastBuildDate>
        <generator>FeedCreator 1.7.2</generator>
        <item>
            <title>c++ stack problem</title>
            <link>http://forum.lowyat.net/topic/646887</link>
            <description>I have problem with stack and the ide say Desktop&amp;#092;c++&amp;#092;Stack.h there are no arguments to `print&amp;#39; that depend on a template parameter, so a declaration of `print&amp;#39; must be available although i already declare the print in other function.I develop this in dev c++ 4.9.9.2 . Here attached with cpp and class file.&lt;br /&gt;&lt;br /&gt;the main function:&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;quot;Stack.h&amp;quot;&lt;br /&gt;&lt;br /&gt;using std::cout;&lt;br /&gt;using std::endl;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    Stack&amp;lt; int &amp;gt;intStack;&lt;br /&gt;    cout &amp;lt;&amp;lt;&amp;quot;Processing an integer Stack&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;    &lt;br /&gt;    for(int i=0;i&amp;lt;5;i++)&lt;br /&gt;    {&lt;br /&gt;            intStack.push(i);&lt;br /&gt;            cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;push into stack&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;            intStack.printStack();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    int popInteger;&lt;br /&gt;    &lt;br /&gt;    while(&amp;#33;intStack.isStackEmpty())&lt;br /&gt;    {&lt;br /&gt;    intStack.pop(popInteger);&lt;br /&gt;    cout&amp;lt;&amp;lt;popInteger&amp;lt;&amp;lt;&amp;quot; popped from stack&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;    intStack.printStack();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    system(&amp;quot;PAUSE&amp;quot;);&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stack.h&lt;br /&gt;#ifndef STACK_H&lt;br /&gt;#define STACK_H&lt;br /&gt;#include &amp;quot;List.h&amp;quot; &lt;br /&gt;template&amp;lt; typename STACKTYPE &amp;gt;&lt;br /&gt;class Stack : private List&amp;lt; STACKTYPE &amp;gt; &lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;   void push( const STACKTYPE &amp;amp;data ) &lt;br /&gt;   { &lt;br /&gt;      insertAtFront( data ); &lt;br /&gt;   } &lt;br /&gt;&lt;br /&gt;   bool pop( STACKTYPE &amp;amp;data ) &lt;br /&gt;   { &lt;br /&gt;      return removeFromFront( data ); &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   bool isStackEmpty() const &lt;br /&gt;   { &lt;br /&gt;     return isEmpty(); &lt;br /&gt;   } &lt;br /&gt; &lt;br /&gt;   void printStack() const &lt;br /&gt;   { &lt;br /&gt;      print(); &lt;br /&gt;   } &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;List.h&lt;br /&gt;#ifndef LIST_H&lt;br /&gt;#define LIST_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using std::cout;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;new&amp;gt;&lt;br /&gt;#include &amp;quot;Listnode.h&amp;quot; // ListNode class definition&lt;br /&gt;&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;class List &lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;   List(); // constructor&lt;br /&gt;   ~List(); // destructor&lt;br /&gt;   void insertAtFront( const NODETYPE &amp;amp; );&lt;br /&gt;   void insertAtBack( const NODETYPE &amp;amp; );&lt;br /&gt;   bool removeFromFront( NODETYPE &amp;amp; );&lt;br /&gt;   bool removeFromBack( NODETYPE &amp;amp; );&lt;br /&gt;   bool isEmpty() const;&lt;br /&gt;   void print() const;&lt;br /&gt;private:&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *firstPtr; // pointer to first node&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *lastPtr; // pointer to last node&lt;br /&gt;&lt;br /&gt;   // utility function to allocate new node&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *getNewNode( const NODETYPE &amp;amp; );&lt;br /&gt;}; // end class List&lt;br /&gt;&lt;br /&gt;// default constructor&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;List&amp;lt; NODETYPE &amp;gt;::List() &lt;br /&gt;   : firstPtr( 0 ), lastPtr( 0 ) &lt;br /&gt;{ &lt;br /&gt;   // empty body&lt;br /&gt;} // end List constructor&lt;br /&gt;&lt;br /&gt;// destructor&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;List&amp;lt; NODETYPE &amp;gt;::~List()&lt;br /&gt;{&lt;br /&gt;   if ( &amp;#33;isEmpty() ) // List is not empty&lt;br /&gt;   {    &lt;br /&gt;      cout &amp;lt;&amp;lt; &amp;quot;Destroying nodes ...&amp;#092;n&amp;quot;;&lt;br /&gt;&lt;br /&gt;      ListNode&amp;lt; NODETYPE &amp;gt; *currentPtr = firstPtr;&lt;br /&gt;      ListNode&amp;lt; NODETYPE &amp;gt; *tempPtr;&lt;br /&gt;&lt;br /&gt;      while ( currentPtr &amp;#33;= 0 ) // delete remaining nodes&lt;br /&gt;      {  &lt;br /&gt;         tempPtr = currentPtr;&lt;br /&gt;         cout &amp;lt;&amp;lt; tempPtr-&amp;gt;data &amp;lt;&amp;lt; &amp;#39;&amp;#092;n&amp;#39;;&lt;br /&gt;         currentPtr = currentPtr-&amp;gt;nextPtr;&lt;br /&gt;         delete tempPtr;&lt;br /&gt;      } // end while&lt;br /&gt;   } // end if&lt;br /&gt;&lt;br /&gt;   cout &amp;lt;&amp;lt; &amp;quot;All nodes destroyed&amp;#092;n&amp;#092;n&amp;quot;;&lt;br /&gt;} // end List destructor&lt;br /&gt;&lt;br /&gt;// insert node at front of list&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;void List&amp;lt; NODETYPE &amp;gt;::insertAtFront( const NODETYPE &amp;amp;value )&lt;br /&gt;{&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *newPtr = getNewNode( value ); // new node&lt;br /&gt;&lt;br /&gt;   if ( isEmpty() ) // List is empty&lt;br /&gt;      firstPtr = lastPtr = newPtr; // new list has only one node&lt;br /&gt;   else // List is not empty&lt;br /&gt;   {&lt;br /&gt;      newPtr-&amp;gt;nextPtr = firstPtr; // point new node to previous 1st node&lt;br /&gt;      firstPtr = newPtr; // aim firstPtr at new node&lt;br /&gt;   } // end else&lt;br /&gt;} // end function insertAtFront&lt;br /&gt;&lt;br /&gt;// insert node at back of list&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;void List&amp;lt; NODETYPE &amp;gt;::insertAtBack( const NODETYPE &amp;amp;value )&lt;br /&gt;{&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *newPtr = getNewNode( value ); // new node&lt;br /&gt;&lt;br /&gt;   if ( isEmpty() ) // List is empty&lt;br /&gt;      firstPtr = lastPtr = newPtr; // new list has only one node&lt;br /&gt;   else // List is not empty&lt;br /&gt;   {&lt;br /&gt;      lastPtr-&amp;gt;nextPtr = newPtr; // update previous last node&lt;br /&gt;      lastPtr = newPtr; // new last node&lt;br /&gt;   } // end else&lt;br /&gt;} // end function insertAtBack&lt;br /&gt;&lt;br /&gt;// delete node from front of list&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;bool List&amp;lt; NODETYPE &amp;gt;::removeFromFront( NODETYPE &amp;amp;value )&lt;br /&gt;{&lt;br /&gt;   if ( isEmpty() ) // List is empty&lt;br /&gt;      return false; // delete unsuccessful&lt;br /&gt;   else &lt;br /&gt;   {&lt;br /&gt;      ListNode&amp;lt; NODETYPE &amp;gt; *tempPtr = firstPtr; // hold tempPtr to delete&lt;br /&gt;&lt;br /&gt;      if ( firstPtr == lastPtr )&lt;br /&gt;         firstPtr = lastPtr = 0; // no nodes remain after removal&lt;br /&gt;      else&lt;br /&gt;         firstPtr = firstPtr-&amp;gt;nextPtr; // point to previous 2nd node&lt;br /&gt;&lt;br /&gt;      value = tempPtr-&amp;gt;data; // return data being removed&lt;br /&gt;      delete tempPtr; // reclaim previous front node&lt;br /&gt;      return true; // delete successful&lt;br /&gt;   } // end else&lt;br /&gt;} // end function removeFromFront&lt;br /&gt;&lt;br /&gt;// delete node from back of list&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;bool List&amp;lt; NODETYPE &amp;gt;::removeFromBack( NODETYPE &amp;amp;value )&lt;br /&gt;{&lt;br /&gt;   if ( isEmpty() ) // List is empty&lt;br /&gt;      return false; // delete unsuccessful&lt;br /&gt;   else &lt;br /&gt;   {&lt;br /&gt;      ListNode&amp;lt; NODETYPE &amp;gt; *tempPtr = lastPtr; // hold tempPtr to delete&lt;br /&gt;&lt;br /&gt;      if ( firstPtr == lastPtr ) // List has one element&lt;br /&gt;         firstPtr = lastPtr = 0; // no nodes remain after removal&lt;br /&gt;      else &lt;br /&gt;      {&lt;br /&gt;         ListNode&amp;lt; NODETYPE &amp;gt; *currentPtr = firstPtr;&lt;br /&gt;&lt;br /&gt;         // locate second-to-last element            &lt;br /&gt;         while ( currentPtr-&amp;gt;nextPtr &amp;#33;= lastPtr )    &lt;br /&gt;            currentPtr = currentPtr-&amp;gt;nextPtr; // move to next node&lt;br /&gt;&lt;br /&gt;         lastPtr = currentPtr; // remove last node&lt;br /&gt;         currentPtr-&amp;gt;nextPtr = 0; // this is now the last node&lt;br /&gt;      } // end else&lt;br /&gt;&lt;br /&gt;      value = tempPtr-&amp;gt;data; // return value from old last node&lt;br /&gt;      delete tempPtr; // reclaim former last node&lt;br /&gt;      return true; // delete successful&lt;br /&gt;   } // end else&lt;br /&gt;} // end function removeFromBack&lt;br /&gt;&lt;br /&gt;// is List empty?&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt; &lt;br /&gt;bool List&amp;lt; NODETYPE &amp;gt;::isEmpty() const &lt;br /&gt;{ &lt;br /&gt;   return firstPtr == 0; &lt;br /&gt;} // end function isEmpty&lt;br /&gt;&lt;br /&gt;// return pointer to newly allocated node&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;ListNode&amp;lt; NODETYPE &amp;gt; *List&amp;lt; NODETYPE &amp;gt;::getNewNode( &lt;br /&gt;   const NODETYPE &amp;amp;value )&lt;br /&gt;{&lt;br /&gt;   return new ListNode&amp;lt; NODETYPE &amp;gt;( value );&lt;br /&gt;} // end function getNewNode&lt;br /&gt;&lt;br /&gt;// display contents of List&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;void List&amp;lt; NODETYPE &amp;gt;::print() const&lt;br /&gt;{&lt;br /&gt;   if ( isEmpty() ) // List is empty&lt;br /&gt;   {&lt;br /&gt;      cout &amp;lt;&amp;lt; &amp;quot;The list is empty&amp;#092;n&amp;#092;n&amp;quot;;&lt;br /&gt;      return;&lt;br /&gt;   } // end if&lt;br /&gt;&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *currentPtr = firstPtr;&lt;br /&gt;&lt;br /&gt;   cout &amp;lt;&amp;lt; &amp;quot;The list is: &amp;quot;;&lt;br /&gt;&lt;br /&gt;   while ( currentPtr &amp;#33;= 0 ) // get element data&lt;br /&gt;   {&lt;br /&gt;      cout &amp;lt;&amp;lt; currentPtr-&amp;gt;data &amp;lt;&amp;lt; &amp;#39; &amp;#39;;&lt;br /&gt;      currentPtr = currentPtr-&amp;gt;nextPtr;&lt;br /&gt;   } // end while&lt;br /&gt;&lt;br /&gt;   cout &amp;lt;&amp;lt; &amp;quot;&amp;#092;n&amp;#092;n&amp;quot;;&lt;br /&gt;} // end function print&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Listnode.h&lt;br /&gt;#define LISTNODE_H&lt;br /&gt;&lt;br /&gt;// forward declaration of class List required to announce that class &lt;br /&gt;// List exists so it can be used in the friend declaration at line 13&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt; class List;                            &lt;br /&gt;&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;class ListNode &lt;br /&gt;{&lt;br /&gt;   friend class List&amp;lt; NODETYPE &amp;gt;; // make List a friend&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;   ListNode( const NODETYPE &amp;amp; ); // constructor&lt;br /&gt;   NODETYPE getData() const; // return data in node&lt;br /&gt;private:&lt;br /&gt;   NODETYPE data; // data&lt;br /&gt;   ListNode&amp;lt; NODETYPE &amp;gt; *nextPtr; // next node in list&lt;br /&gt;}; // end class ListNode&lt;br /&gt;&lt;br /&gt;// constructor&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;ListNode&amp;lt; NODETYPE &amp;gt;::ListNode( const NODETYPE &amp;amp;info )&lt;br /&gt;   : data( info ), nextPtr( 0 ) &lt;br /&gt;{ &lt;br /&gt;   // empty body&lt;br /&gt;} // end ListNode constructor&lt;br /&gt;&lt;br /&gt;// return copy of data in node&lt;br /&gt;template&amp;lt; typename NODETYPE &amp;gt;&lt;br /&gt;NODETYPE ListNode&amp;lt; NODETYPE &amp;gt;::getData() const &lt;br /&gt;{ &lt;br /&gt;   return data; &lt;br /&gt;} // end function getData&lt;br /&gt;&lt;br /&gt;#endif</description>
            <author>tud09</author>
            <category>Codemasters</category>
            <pubDate>Fri, 07 Mar 2008 15:57:41 +0800</pubDate>
        </item>
    </channel>
</rss>
