首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++编程思想上的例题异常 求解

2012-02-23 
c++编程思想上的例题错误 求解?下面是个容器类的头文件实现,在主程序里面编译无法通过,错误地方已经标出:

c++编程思想上的例题错误 求解?
下面是个容器类的头文件实现,在主程序里面编译无法通过,错误地方已经标出:
在msdn查的是Stack未完全定义,不能定义或者声明指向它的指针或引用,但是要是把错误的地方改成:Stack*   p;或者Stackk&   p就对了。怎么回事呢?我换了GNU的编译器也出现一样的编译错误。这是书上的例子啊,勘误表也没有找着。

#ifndef   TPSTACK_H
#define   TPSTACK_H
#include   "require.h "
template <class   T>
class   Stack   {
struct   Link   {
T*   data;
Link*   next;
Link(T*   dat,   Link*   nex)
:   data(dat),   next(nex)   {}
}*   head;
public:
Stack()   :   head(0)   {}
~Stack();
void   push(T*   dat)   {
head   =   new   Link(dat,head);
}
T*   peek()   const   {
return   head   ?   head-> data   :   0   ;
}
T*   pop();
class   iterator;//迭代器
friend   class   iterator;
class   iterator   {
Stack::Link*   p;//error   C2027:   use   of   undefined   type
public:
iterator(const   Stack&   t)   :   p(t.head)   {}
iterator(const   iterator&   t)   :   p(t.p)   {}
//
iterator()   :   p(0)   {}
bool   operator++()   {
if(p-> next)
p   =   p-> next;
else
p   =   0;
return   bool(p);
}
bool   operator++(int)   {
return   operator++();
}
T*   current()   const   {
if(!p)
return   0;
return   p-> data;
}
//
T*   operator-> ()   const   {
require(p   !=   0,  
"operator-> returns   0 ");
return   current();
}
//
T*   operator*()   const   {
return   current();
}
//..............
operator   bool()   const   {
return   bool(p);
}
////////////
bool   operator==(const   iterator&   )   const   {
return   p   ==   0;
}
bool   operator!=(const   iterator&   )   const   {
return   p   !=   0;
}
};
iterator   begin()   const   {
return   iterator(*this);
}
iterator   end()   const   {
return   iterator();
}
};

template <class   T>
Stack <T> ::~Stack()   {
while(head)
delete   pop();
}

template <class   T>
T*   Stack <T> ::pop()   {
if(!head)   return   0;
T*   result   =   head-> data;
Link*   oldHead   =   head;
head   =   head-> next;
delete   oldHead;
return   result;
}

#endif///////////~


[解决办法]
typename 是 C++98标准 中提出的新关键字,VC6很可能不支持的。
LZ可以用 sturct 或 class 试试
struct Stack::Link* p;
可能会好。

在VC8 和Dev-cpp(g++ 3.4.2) 上测试了一下,加上 typename 或 struct 或 class 后都可以通过编译。
[解决办法]
别用 vc6 了,太古老了,vc6 出来的时候 c++ 标准都还没定案,换罢。。。

热点排行