可能重复:
Where and why do I have to put the “template” and “typename” keywords?
我正在学习模板功能。我试图实现一个清除指针列表的静态模板函数。要做到这一点,我想使用模板。它是我的代码:
#include <cstdio>
#include <list>
using namespace std;
class util
{
public:
template <class ARG>
static void CleanPointers(list<ARG> &mylist) {
list<ARG>::iterator it;
for (it = mylist.begin(); it != mylist.end(); it++)
{
ARG obj = (ARG) *it;
delete obj;
}
mylist.clear();
};
util();
~util();
};
int main()
{
list<int*> mylist;
mylist.push_back(new int(1));
mylist.push_back(new int(2));
util::CleanPointers<int*>(mylist);
return 0;
}
我收到了关注编译错误消息,我不明白这里有什么意义。 :)为什么需要我把;在它之前?
prog.cpp: In static member function ‘static void util::CleanPointers(std::list<ARG, std::allocator<_Tp1> >&)’:
prog.cpp:10: error: expected `;' before ‘it’
prog.cpp:11: error: ‘it’ was not declared in this scope
prog.cpp: In static member function ‘static void util::CleanPointers(std::list<ARG, std::allocator<_Tp1> >&) [with ARG = int*]’:
prog.cpp:28: instantiated from here
prog.cpp:10: error: dependent-name ‘std::list::iterator’ is parsed as a non-type, but instantiation yields a type
prog.cpp:10: note: say ‘typename std::list::iterator’ if a type is meant
答案 0 :(得分:2)
需要typename,因此:
typename list<ARG>::iterator it;
这不是代码唯一的错误。你为什么要在删除前转换为int?当它不是指向int的指针集合时,这是一个糟糕的错误。如果你打算这样做,你应该通过正确的指针类型删除。
此外,由于ARG必须是指针类型,因此您可以进行部分专业化。
C++ FAQ about templates。我建议阅读所有这些内容。
另请参阅常见问题解答,了解为什么演员表是邪恶的,它也可以解释删除会发生什么。
答案 1 :(得分:1)
typename list<ARG>::iterator it;
答案 2 :(得分:1)
list<ARG>::iterator
是一种依赖类型:
typename list<ARG>::iterator it;
请参阅Where and why do I have to put the "template" and "typename" keywords?
答案 3 :(得分:0)
我认为你的主要错误是在某处定义var'it'的类型。 在错误10之后,所有编译器错误都是垃圾,因为编译器尝试使用非类型var完成for循环。