我有以下问题:
当我将模板函数传递给另一个模板函数时,它不起作用,但当我将正常函数传递给模板函数时,它会正常编译,例如:
template<class It, class Pred>
It findif(It begin,It end, Pred pr){
while (begin!=end && !pr(*begin))
begin++;
return begin;
}
bool p(const string& s){
/* some code */
}
当我将p传递给findif它有效,但这不是:
template<class It, class Pred>
It findif(It begin,It end, Pred pr){
while (begin!=end && !pr(*begin))
begin++;
return begin;
}
template<class T
bool p(const T& s){
/* some code */
}
答案 0 :(得分:1)
模板功能是功能的蓝图,它们本身并不具备功能。您必须实例化其中一个,以便编译器生成该特定实例。例如,您无法做到:
template<class It, class Pred>
It findif(It begin,It end, Pred pr) {
while (begin!=end && !pr(*begin))
begin++;
return begin;
}
template<class T>
bool p(const T& s) {
/* some code */
}
int main() {
std::vector<int> v{1,2,3};
findif(v.begin(), v.end(), p);
}
您必须首先实例化代码的函数模板才能被接受。也就是说,你必须提供明确的参数:
findif(v.begin(), v.end(), p<int>);
^^^^^^
答案 1 :(得分:0)
如果您希望保留模板并仍然推导出模板参数,那么通常的方法是使用仿函数:
struct p {
template<class T>
bool operator()(const T& s) const { /*...*/ }
};
// ...
findif(v.begin(), v.end(), p{});