读书人

关于类模板的缺省实参有关问题

发布时间: 2012-01-14 20:02:35 作者: rapoo

关于类模板的缺省实参问题
各位都是高手了,问一个基础问题:
我写了如下代码,想利用类模板的缺省实参,但是发现当我设定的实参大小和缺省值不一样的时候,编译会出错。请指教。
#include <iostream.h>

template <class T, short nSize = 100>
class CStack
{
public:
CStack();
~CStack(){};

void Push(T value);
T Pop();
bool IsEmpty();
bool HasElements();
bool IsFull();
long GetSize();

private:
T m_data[nSize];
short m_sPos;
};

template <class T, short nSize = 100>
CStack <T> ::CStack()
{
m_sPos = 0;
}


template <class T, short nSize = 100>
void CStack <T> ::Push(T value)
{
m_data[m_sPos++] = value;
}

template <class T, short nSize = 100>
T CStack <T> ::Pop()
{
return m_data[--m_sPos];
}

template <class T, short nSize = 100>
bool CStack <T> ::IsEmpty()
{
return (m_sPos == 0);
}

template <class T, short nSize = 100>
bool CStack <T> ::HasElements()
{
return (m_sPos != 0);
}

template <class T, short nSize = 100>
bool CStack <T> ::IsFull()
{
return (m_sPos == nSize);
}

template <class T, short nSize = 100>
long CStack <T> ::GetSize()
{
return nSize;
}

int main(int argc, char *argv[])
{
CStack <double> doubleStack;
//CStack <double, 20> doubleStack; 如此用法,编译出错。
cout < < "doubleStack 's size is: " < < doubleStack.GetSize() < < endl;
doubleStack.Push(1.1);
doubleStack.Push(1.2);
doubleStack.Push(2.4);
while(doubleStack.HasElements())
{
cout < < doubleStack.Pop() < < endl;
}


CStack <long> *plongStack = new CStack <long,100> ;
cout < < "plongStack 's size is : " < < plongStack-> GetSize() < < endl;
plongStack-> Push(30000000);
plongStack-> Push(4.223);
while(plongStack-> HasElements())
{
cout < < plongStack-> Pop() < < endl;
}
delete plongStack;

return 0;
}


[解决办法]
将所有模版函数定义放入
class CStack{
...
}

就可以了.
[解决办法]
template <class T, short nSize = 100>
CStack <T,nSize > ::CStack()参数少了一个
{
m_sPos = 0;
}

读书人网 >VC/MFC

热点推荐