不合格的ID和模板类
Unqualified IDs and Template Classes
我一直在为循环列表编写一个自定义类,称为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)
为什么它认为CITERAT是模板,而T显然是模板?我只是很困惑。
错误消息指出CIterator<T>
不被视为模板。这是因为它是一个依赖名称,编译器只能在实例化时真正确定它实际上是一个嵌套模板。解决这个问题的方法是告诉编译器它实际上是一个模板:
template <class T>
typename CList<T>::template CIterator<T> CList<T>::push(T const& v)
{
...
}
编译器不知道CList<T>::CIterator<T>
是否是模板的原因是,类CList<X>
可能专门用于某些类型的X
,使其内部没有嵌套模板。然而,编译器只有在实例化模板时才能发现这些专门化。
相关文章:
- 方法内部但循环仍得到预期的不合格id错误C++
- C 预期的不合格ID(类继承)
- 解析问题:预期的不合格的ID和语义问题:C 需要所有声明的类型说明符
- 字符串常量(包括ZenLib/Ztring.h)之前应为不合格id
- Arduino-应为不合格的id
- int之前应为不合格id
- while c++之前应为不合格id
- 预期的不合格id错误,很可能是原因
- 标头C++中应为不合格Id
- 不合格的ID和模板类
- C++中类出现预期的不合格id错误
- QDir目录之前应为不合格的id
- 第25行应为不合格的-id,我该如何更正
- 错误:“int”之前应为不合格的id
- iOS中出现不合格的id错误
- 奇怪的模板错误:应为不合格id
- C++:错误:在“!”之前应为不合格的id代币
- 错误:在if之前需要不合格的id
- 不合格的id错误和井字游戏板不工作
- C++编译错误:在"{"标记之前应为不合格的id