2

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

我正在学习模板功能。我正在尝试实现一个清除指针列表的静态模板函数。为此,我想使用模板。它是我的代码:

#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
4

4 回答 4

2

需要类型名,因此:

typename list<ARG>::iterator it;

不过,这并不是代码的唯一错误。为什么在删除之前要转换为 int ?当它不是指向整数的指针集合时,这是一个糟糕的错误。如果您打算这样做,您应该通过正确的指针类型进行删除。

此外,您可以进行部分专业化,因为 ARG 必须是指针类型。

关于模板的 C++ 常见问题解答。我建议阅读所有这些。

另请参阅有关强制转换为何邪恶的常见问题解答,它也可能解释删除会发生什么。

于 2012-09-13T14:31:56.307 回答
1

从属名称

typename list<ARG>::iterator it;
于 2012-09-13T14:32:02.860 回答
1

list<ARG>::iterator是依赖类型:

typename list<ARG>::iterator it;

请参阅在哪里以及为什么必须放置“模板”和“类型名称”关键字?

于 2012-09-13T14:32:52.570 回答
0

我认为您的主要错误是在某处定义 var 'it' 的类型。在错误 10 之后,所有编译器错误都是垃圾,因为编译器尝试使用非类型 var 完成 for 循环。

于 2012-09-13T14:35:02.030 回答