2012-06-15 151 views
1

我想定義一個帶模板參數的輔助函數。我已經嘗試爲此創建模板化函數,但它不能編譯。任何想法我做錯了什麼?這是我嘗試的代碼。聲明帶模板參數的函數

// vectors are great, but lack a find method. Implement one as a helper. 
template<class T> bool vec_find(vector<T> &v, T obj) 
{ 
    vector<T>::iterator s; 
    for (s = v.begin(); s < v.end(); s++) 
    { 
     if (*s == obj) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

你把這個放在頭文件中嗎?什麼是編譯器錯誤? – GregC

+7

使用'std :: find'。 –

+3

我想你需要在'vector :: iterator'之前的'typename'。另外,你不應該在迭代器中使用 chris

回答

1

大概,你的編譯器告訴你問題是什麼。礦山說:

test.cpp:7:5: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope 

因此,要解決這個問題,添加typenamevector<T>::iterator

typename vector<T>::iterator s; 
^^^^^^^^ 

一般情況下,你需要,只要一個類型名稱的範圍取決於模板參數;直到模板被實例化爲止,編譯器不知道vector<T>將如何定義,因此需要被告知其中的名稱是指類型而不是別的。

但是,vector沒有find方法的原因很充分:C++庫將容器與作用於它們的算法分開,以便任何算法都可以對任何合適的序列進行操作。你想爲此使用std::find

return std::find(v.begin(), v.end(), obj) != v.end(); 
+0

我剛剛意識到OP從來沒有說過這個問題出現在函數頭部。無論出於何種原因,我認爲他們做到了:p – chris

+0

謝謝! std :: find()是一個很好的解決方案。 – user1459315