我不能为我的生活弄清楚这个函数模板中的以下复杂的参数类型组合发生了什么,我需要调用我缺少的。我试图调用具有此签名的函数模板:
template <class T> list<T> map(T (*f)(const T &i), const list<T> &il);
我的代码如下所示:
int successor(int n) {
return n+1;
}
int main ()
{
list<int> seq = ez_list(0,1,2,3,4); // I know that this part is right
map(successor, seq); // this function call is not recognized
return 0;
}
Eclipse说“无效的参数”候选者是:list&lt;#0&gt; map(#0(*)(const#0&amp;),const list&lt;#0&gt;“但我看不出它与我有。请向我解释我的论点有什么问题,即他们如何不能匹配功能模板签名以及他们应该如何适应它。
编辑:感谢大家提供关于如何使这个更干净的建议,不幸的是,地图的定义来自我必须使用的其他人的代码。我会记住你对我将来使用的建议。
答案 0 :(得分:2)
Reachability *reach = [Reachability reachabilityWithHostname:@"www.google.com"];
if ([reach isReachable]){
// Reachable
NSLog(@"reachable");
}else{
// not Reachable
NSLog(@"unreachable!");
}
与int successor(int n)
模板实例化期望的是什么。
答案 1 :(得分:0)
@StoryTeller所说的是正确的......但还有更多。
这将解决眼前的问题,即函数签名由于常量参数而不匹配,你必须传递函数的地址 ....
int successor(const int& n) {
return n+1;
}
int main ()
{
list<int> seq = ez_list(0,1,2,3,4);
map(&successor, seq); // pass the address of the function
return 0;
}
现在,第二个问题。为了让所有人在将来阅读您的代码,请不要这样做。使用仿函数:
template<typename T>
class MyFunctor
{
public:
T operator()(const T& arg)
{
//Do your function work in here...
}
}
(有关函数对象的深入描述,请参阅http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html)
当然,这可能非常简洁,所以如果你想要包装一个函数指针,C ++就有了它的便利。现在,您可以在不使用混淆指针语法的情况下包装函数对象:
#include <functional>
template <class T> list<T> map(std::function<T(const T&), const list<T> &il);
int successor(int n) {
return n+1;
}
int main ()
{
list<int> seq = ez_list(0,1,2,3,4); // I know that this part is right
std::function<T (const T&)> successor = std::bind(&successor, std::placeholders::_1);
map(successor, seq); // Look, ma, no function pointer!
return 0;
}