模板问题
问题描述:
为什么地球上我可以这样做:模板问题
#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被接受,而模板则不被接受。
答
问题是你不能创建一个指向模板函数的指针。你应该可以创建一个指向实例化模板函数的指针。我还没有试过,但下面应该工作:
for_each (myvector.begin(), myvector.end(), myfunction<int>)
答
您无法将模板传递给for_each
的第三个参数。您必须通过可通过operator()()
调用的实例。在这种情况下,你可以通过提供功能的所有模板参数实例化函数模板:
std::for_each(myvector.begin(), myvector.end(), &myfunction<int>);
在一个侧面说明,你应该避免using namespace std
,因为它引入了很多名字,可与您的标识符发生冲突。另外,你应该使用&
语法来清楚地表明你正在传递一个函数指针。
答
因为编译器不能将模板转换成谓词隐含。你必须明确说明什么函数调用:
#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;
}
+1的造型建议。 – 2010-09-22 00:48:01