我一直在为循环列表编写一个自定义类,称为CList。我已经完成了很久以前完成的家庭作业,并且有大量的复制粘贴,所以我并不完全记得我写的所有作品。
无论如何,只是尝试包含.h文件会导致使用命名空间std行出错:
main.cpp:11: error: expected unqualified-id before ';' token
以及在我的代码中指向函数的两个错误:
In file included from main.cpp:9:
CList.h:119: error: non-template 'CIterator' used as template
CList.h:119: note: use 'CList<T>::template CIterator' to indicate that it is a template
这是有问题的功能:
template <class T>
typename CList<T>::CIterator<T> CList<T>::push(T const& v)
{
size++;
Node<T>* p = new Node<T>(v);
if (this -> size_ == 1)
{
head = p;
tail = p;
p -> next = p;
p -> prev = p;
}
else
{
tail -> next = p;
p -> next = head;
p -> prev = tail;
head -> prev = p;
tail = p;
}
return CIterator(p);
}
我真的不明白这里的错误是什么。我告诉函数返回CList的CIterator,并且表示此函数是CList类的一部分。这是我在阅读
行时所理解的typename CList<T>::CIterator<T> CList<T>::push(T const& v)
当T是模板时,为什么认为CIterator是模板?我很困惑。
答案 0 :(得分:1)
错误消息指出CIterator<T>
不被视为模板。这是因为它是一个依赖名称,编译器只能在实例化时确定它确实是一个嵌套模板。解决问题的方法是告诉编译器它实际上是一个模板:
template <class T>
typename CList<T>::template CIterator<T> CList<T>::push(T const& v)
{
...
}
编译器不知道CList<T>::CIterator<T>
是否为模板的原因是类CList<X>
可能专门用于某些类型X
,而内部没有嵌套模板。但是,编译器仅在实例化模板时才发现这些特化。