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++ 标准都还没定案,换罢。。。