2011-12-12 95 views
2

我試圖創建一個模板函數接受任何類型T的向量參數(原始現在),並打印出它的內容:語法聲明一個函數模板

template<class T> 
void displayContents(const vector<T>& data) 
{ 
    vector<T>::const_iterator i; 
    i=data.begin(); 

    for(; i!=data.end(); i++){ 
     cout<<*i<endl; 
    } 
} 

的錯誤信息是:

In function 'void displayContents(const std::vector >&)': error: expected ';' before 'i' | error:'i' was not declared in this scope === Build finished: 2 errors, 0 warnings ===

我是否忽略了語法錯誤?

回答

5

嘗試以下操作:

typename vector<T>::const_iterator i; 

正如在比約恩已經,這是因爲需要評論指出的是模板的一個從屬名稱。

+7

的問題是,'const_iterator'是*依賴名稱* - 你可以在這裏閱讀更多關於它:http://stackoverflow.com/questions/610245。 –

+1

實際上BjörnPollex評論應該是被接受的答案 – Begemoth

+0

「**模板的**依賴名稱」非常具有誤導性,「const_iterator」是** **依賴名稱。 –

3

如果你的目標是輸出每個元素,你不應該限制自己的向量。真正地道的,通用的解決方案是通過兩個迭代器來代替:

template<typename ForwardIterator> 
void display_contents(ForwardIterator begin, ForwardIterator end) 
{ 
    for (ForwardIterator it = begin; it != end; ++it) 
    { 
     std::cout << *it << '\n'; 
    } 
} 

然後你可以使用與向量,套模板,幾乎所有其他容器:

int main() 
{ 
    std::vector<int> a {2, 3, 5, 7}; 
    display_contents(a.begin(), a.end()); 

    std::set<int> b {11, 13, 17, 19}; 
    display_contents(b.begin(), b.end()); 
} 
+0

不完全是我正在尋找的東西,但注意到未來的努力:) – Zubizaretta