2010-09-20 129 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; 
}