这个问题已经在这里有了答案:




已关闭8年。






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

#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

最佳答案

需要typename,因此:

typename list<ARG>::iterator it;

这不是代码唯一的问题。为什么要在删除之前强制转换为int?如果它不是指向int的指针的集合,那将是一个非常糟糕的错误。如果要这样做,则应删除适当的指针类型。

另外,由于ARG必须是指针类型,因此您可以进行部分特化。

C++ FAQ about templates。我建议阅读所有这些内容。

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

10-08 09:17
查看更多