友元函数访问嵌套类。该如何处理
友元函数访问嵌套类。。。
标题表达有点词不达意,先将部分代码帖上:
template <class T>
class Queue
{
// template <class T>
friend ostream& operator < < <T> (ostream& , const Queue <T> &);
friend class QueueItem;
public:
Queue();
~Queue();
T& remove();
void add(const T&);
bool is_empty() const;
private:
class QueueItem;
QueueItem* front;
QueueItem* back;
};
template <class T>
ostream& operator < < (ostream& os, const Queue <T> & q)
{
Queue <T> :: QueueItem* ptr = q.front; //此处编译器报错,请问各位友元函数要用嵌套类类型时应该怎样限定修饰 QueueItem*啊?
while (ptr != q.back)
{
os < < ptr-> Item < < " ";
ptr = ptr-> next;
}
os < < q.back-> Item;
os < < endl;
return os;
}
谢谢
------解决方案--------------------
typename Queue <T> :: QueueItem* ptr = q.front;
------解决方案--------------------
因为“Queue <T> :: QueueItem”这外名字对模板参数有依赖,而对模板参数有依赖的东西需要到模板真正被实例化了的时候才能确定。在这之前,编译器只看到一个“::”之后跟着一个标志符,却常常无法确定那个标志符表示的是个静态的成员变量,还是个成员类型。
加上typename,就是确切的告诉编译器,那里是个类型名,不是个变量名。
标题表达有点词不达意,先将部分代码帖上:
template <class T>
class Queue
{
// template <class T>
friend ostream& operator < < <T> (ostream& , const Queue <T> &);
friend class QueueItem;
public:
Queue();
~Queue();
T& remove();
void add(const T&);
bool is_empty() const;
private:
class QueueItem;
QueueItem* front;
QueueItem* back;
};
template <class T>
ostream& operator < < (ostream& os, const Queue <T> & q)
{
Queue <T> :: QueueItem* ptr = q.front; //此处编译器报错,请问各位友元函数要用嵌套类类型时应该怎样限定修饰 QueueItem*啊?
while (ptr != q.back)
{
os < < ptr-> Item < < " ";
ptr = ptr-> next;
}
os < < q.back-> Item;
os < < endl;
return os;
}
谢谢
------解决方案--------------------
typename Queue <T> :: QueueItem* ptr = q.front;
------解决方案--------------------
因为“Queue <T> :: QueueItem”这外名字对模板参数有依赖,而对模板参数有依赖的东西需要到模板真正被实例化了的时候才能确定。在这之前,编译器只看到一个“::”之后跟着一个标志符,却常常无法确定那个标志符表示的是个静态的成员变量,还是个成员类型。
加上typename,就是确切的告诉编译器,那里是个类型名,不是个变量名。