2012-09-13 59 views
2

可能重复:
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; 
} 

我recived跟随编译错误消息,我不明白这里的重点。 :)为什么需要我放;在之前呢?

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

我认为使用短语“清除指针”是一个非常糟糕的主意,因为这意味着什么也没有,并且可能是灾难性的误导。正确的概念是“删除一个动态分配的对象(通过调用指向该对象的指针delete”)。 –

+0

@KerrekSB,yeap!你是对的。我会改变这一点。 –

回答

2

需求类型名称,即:

typename list<ARG>::iterator it; 

这是不是唯一的东西错了,虽然代码。为什么你在删除之前转换为int?当它不是指向int的指针集合时,这是一个糟糕的错误。如果你打算这样做,你应该通过正确的指针类型删除。

此外,由于ARG必须是指针类型,因此您可以放入部分专业化。

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

另请参阅常见问题解答,了解为什么施法是邪恶的,它也可能解释删除操作会发生什么。

+0

你能解释一下为什么吗?或者给我一些链接来阅读。 –

+0

我这样做是因为我将ARG更改为int *,并且代码有效,当我更改后我没有更改全部。 (这是我的代码:http://ideone.com/L6mQY)我应该编辑我的问题,因为它不是关于我的主要问题?这只是一个错字。 –

+1

delete与C中的free不一样,它不仅释放内存,而且还删除下面的对象。因此,如果您的指针不是int *,则将其转换为int *是未定义的行为。 – CashCow

1

Dependent names

typename list<ARG>::iterator it; 
+0

这不是问题的答案。哇,看着你的答案大部分让我假设你真的是在数量上,而不是质量上的网站。你的许多答案最初都会受到抨击(当之无愧),而且真的只有一半的想法。 –

+0

@phresnel答案包含修复和解释链接。我不明白这与其他人有什么不同。你还会做什么? –

+0

幸运(即你对一篇文章的傲慢评论,然后在另一篇文章中做出错误和愚蠢的回答,与你的傲慢相矛盾)我现在只看到你的答案。 “其他人也这样做了”,这不是一个聪明的人的论点。但相信我,我也批评和鼓励别人。问题与你的帖子:本身,它教导提问者:问:“这个实现有什么问题?”,答:“依赖名称!”,问:“相关名称是错误的?! 。一般来说,在SO上的答案应该是:a)答案,b)自包含(不要依赖链接不发生)。你的答案既不是。 –

0

我觉得你的主要错误是定义变种“这是什么地方的类型。 错误10后,所有编译器错误都是垃圾,因为编译器会尝试使用非类型变量完成for循环。