When I run this code (Visual Studio 2005), I get the following compiler errors and can't fix this no matter what I do:

c:\documents and settings\dthomas006\my documents\visual studio 2005\projects\pa3-q1\pa3-q1\stacktype.h(10) : error C2143: syntax error : missing ';' before '<'

c:\documents and settings\dthomas006\my documents\visual studio 2005\projects\pa3-q1\pa3-q1\stacktype.h(24) : see reference to class template instantiation 'StackType<ItemType>' being compiled

c:\documents and settings\dthomas006\my documents\visual studio 2005\projects\pa3-q1\pa3-q1\stacktype.h(10) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

c:\documents and settings\dthomas006\my documents\visual studio 2005\projects\pa3-q1\pa3-q1\stacktype.h(10) : error C2238: unexpected token(s) preceding ';'


To me, it sounds like it doesn't like ItemType not being declared but I thought that was the point of using a template. I also attached the file with my main in it. I've looked at other programs I wrote with class templates (this is the first one using stacks) and can't figure out what's wrong. I usually separate the header and implementation files but decided to do it all in one this time. Any suggestions you can give are appreciated. :S

#include <iostream>
#include <cstddef>

using namespace std;

template <class ItemType>
class StackType
{
private:
    NodeType<ItemType>* topPtr; // It points to a singly-linked list
public:
    StackType(); // default constructor: StackType is created and empty
    ~StackType(); // Destructor: memory for nodes needs to be deallocated
    StackType(const StackType<ItemType> &x); // copy constructor: implicitly called for pass
                                    // by value
    void MakeEmpty(); // StackType is made empty
    bool IsEmpty(); // test if the stack is empty
    bool IsFull(); // test if the stack is full
    int Length(); // return the number of elements in the stack
    void Print(); // print the value of all elements 
                    //in the stack in the sequence from the top to bottom
    void Push(ItemType x); // insert x onto the stack- Precondition: the stack is not full
    void Pop(); // delete the top element from the stack -- Precondition: the stack is not empty
};

template<class ItemType>
struct NodeType
{
ItemType info;
NodeType* next;
};

template<class ItemType>
StackType<ItemType>::StackType()
{
    topPtr=NULL;
}

template<class ItemType>
bool StackType<ItemType>::IsEmpty()
{
    return (topPtr==NULL);
}


template<class ItemType>
StackType<ItemType>::StackType(const StackType<ItemType> &x)
{
    NodeType<ItemType> *p1;
    NodeType<ItemType> *p2;
    
    if (x.topPtr==NULL)
        topPtr=NULL;
    else
    {
        topPtr=new NodeType<ItemType>;
        topPtr->info=x.topPtr->info;
        p1=x.topPtr->next;
        p2=topPtr;

        while (p1 !=NULL)
        {
            p2->next=new NodeType<ItemType>;
            p2=p2->next;
            p2->info=p1->info;
            p1=p1->next;
        }
        p2->NULL;
    }
}

template<class ItemType>
void StackType<ItemType>::MakeEmpty()
{
    NodeType<ItemType> *tp;

    while (topPtr !=NULL)
    {
        temp=topPtr;
        topPtr=topPtr->next;
        delete temp;
    }
}

template<class ItemType>
StackType<ItemType>::~StackType()
{
    NodeType<ItemType> *tp;

    while (topPtr !=NULL)
    {
        temp=topPtr;
        topPtr=topPtr->next;
        delete temp;
    }
}

template<class ItemType>
bool StackType<ItemType>::IsFull( )
{
    NodeType<ItemType> *fp;
    
    if (fp=new NodeType<ItemType>)
    {
        delete fp;
        return false;
    }
    else
        return true;
}


template<class ItemType>
int StackType<ItemType>::Length( )
{
    int count=0;
    NodeType<ItemType> *cp;
    cp=topPtr;

    while (cp!=NULL)
    {
        count++;
        cp=cp->next;
    }
    return count;
}

template<class ItemType>
void StackType<ItemType>::Print( ) // print the value of all elements in the stack in the sequence
// from the top to bottom
{
    NodeType<ItemType> *pp;
    pp=topPtr;

    while (pp!=NULL)
    {
        cout<<pp->info<<endl;
        pp=pp->next;
    }
}


template<class ItemType>
void StackType<ItemType>::Push(ItemType x) // insert x onto the stack
// Precondition: the stack is not full
{
    NodeType<ItemType> *pushptr;
    pushptr = new NodeType<ItemType>;
    pushptr->info=x;
    pushptr->next=topPtr;
    topPtr=pushptr;
}

template<class ItemType>
void StackType<ItemType>::Pop() // delete the top element from the stack
// Precondition: the stack is not empty
{
    NodeType<ItemType> *popptr;
    popptr=topPtr;
    topPtr=topPtr->next;
    delete popptr;
}
Attachments
#include <iostream>
#include <cstddef>
#include <conio.h>
#include "stacktype.h"

using namespace std;

int main ()
{
StackType <int> IntStack;
int x;
//try{
IntStack.Push(1);
IntStack.Push(2);
IntStack.Pop();
IntStack.Push(3);
IntStack.Push(4);
cout << "int length 1 = " << IntStack.Length() << endl;
IntStack.Pop();
cout << "int length 2 = " << IntStack.Length() << endl;
//}
IntStack.Print();
_getch();

StackType <float> FloatStack;
float y;
//try{
FloatStack.Push(7.1);
FloatStack.Push(5.4);
FloatStack.Pop();
cout << "float length 1 = " << FloatStack.Length() << endl;
FloatStack.Push(2.3);
FloatStack.Push(3.1);
cout << "float length 2 = " << FloatStack.Length() << endl;
FloatStack.Pop();
//}

FloatStack.Print();

/*catch (FullStackType)
{
	cout<<"StackType is full. Exception thrown."<<endl;
}

catch (EmptyStackType)
{
	cout<<"StackType is empty. Exception thrown."<<endl;
}*/


_getch();
return 0;
}

NodeType (line 10) has not been defined so your compiler has no clue what it is.

Thanks much! I now realize before I did a forward declaration then wrote the function definition in the implementation file. :)

This question has already been answered. Start a new discussion instead.