2012-09-13 100 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循環。