为什么我能做到这一点:
#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被接受而模板不被接受。
答案 0 :(得分:10)
问题是您无法创建指向模板函数的指针。您应该能够创建指向实例化模板函数的指针。我没有尝试过,但以下情况应该有效:
for_each (myvector.begin(), myvector.end(), myfunction<int>)
答案 1 :(得分:5)
您无法将模板传递给for_each
的第三个参数。您必须通过operator()()
传递可调用的实例。在这种情况下,您可以通过提供函数的所有模板参数来实例化函数模板:
std::for_each(myvector.begin(), myvector.end(), &myfunction<int>);
另一方面,您应该避免使用using namespace std
,因为它会引入许多可能与您的标识符冲突的名称。此外,您应该使用&
语法清楚地表明您正在传递函数指针。
答案 2 :(得分: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;
}