2010-09-20 84 views
3

爲什麼地球上我可以這樣做:模板問題

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

void myfunction (int i) { 
    cout << " " << i; 
} 

int main() { 
    vector<int> myvector; 
    myvector.push_back(10); 
    myvector.push_back(20); 
    myvector.push_back(30); 

    cout << "myvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myfunction);//<-------See below 
return 0; 
} 

,但不能做到這一點:

template<class T> 
    void myfunction (T i) { 
      cout << " " << i; 
     } 

我懷疑它是與ARGS扣除,但它是如此令人氣憤「常規」fnc被接受,而模板則不被接受。

回答

10

問題是你不能創建一個指向模板函數的指針。你應該可以創建一個指向實例化模板函數的指針。我還沒有試過,但下面應該工作:

for_each (myvector.begin(), myvector.end(), myfunction<int>) 
5

您無法將模板傳遞給for_each的第三個參數。您必須通過可通過operator()()調用的實例。在這種情況下,你可以通過提供功能的所有模板參數實例化函數模板:

std::for_each(myvector.begin(), myvector.end(), &myfunction<int>); 

在一個側面說明,你應該避免using namespace std,因爲它引入了很多名字,可與您的標識符發生衝突。另外,你應該使用&語法來清楚地表明你正在傳遞一個函數指針。

+0

+1的造型建議。 – 2010-09-22 00:48:01

4

因爲編譯器不能將模板轉換成謂詞隱含。你必須明確說明什麼函數調用:

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

template <typename T> 
void myfunction (T i) 
{ 
    cout << " " << i; 
} 

int main() { 
    vector<int> myvector; 
    myvector.push_back(10); 
    myvector.push_back(20); 
    myvector.push_back(30); 

    cout << "myvector contains:"; 
    for_each (myvector.begin(), myvector.end(), myfunction<int>); 
    cout << endl; 
} 

或者,你可以寫這樣的斷言:

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

struct MyPredicate { 
    template <typename T> 
    void operator() (T i) 
    { 
     cout << " " << i; 
    } 
}; 

int main() { 
    vector<int> myvector; 
    myvector.push_back(10); 
    myvector.push_back(20); 
    myvector.push_back(30); 

    cout << "myvector contains:"; 
    for_each (myvector.begin(), myvector.end(), MyPredicate()); 
    cout << endl; 
}