我正在尝试从基础知识中学习c ++,而我正在使用函数指针。考虑这段代码:
#include <iostream>
#include <string>
#include <vector>
bool print(std::string);
bool print(std::string a)
{
std::cout << a << std::endl;
return true;
}
bool call_user_function(bool(std::string), std::vector<std::string>);
bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) {
if (args.size() == 0)
return (*p)(); (*)
else if (args.size() == 1)
return (*p)(args[0]);
else if (args.size() == 2)
return (*p)(args[0], args[1]); (**)
}
int main(int argc, char** argv)
{
std::vector<std::string> a;
a[0] = "test";
call_user_function(print, a);
// ok
return 0;
}
它给了我:
main.cpp:28(*):错误:函数的参数太少
main.cpp:32(**):错误:函数的参数太多
我做错了什么?
答案 0 :(得分:3)
p
的类型为bool(*)(std::string)
。这意味着它是一个指向函数的指针,该函数具有std::string
类型的单个参数并返回bool
。
p
可以指向print
,因为print
的类型匹配:它是一个具有std::string
类型的单个参数并返回{{1}的函数}}
您的第一个错误表达式bool
尝试在没有参数的情况下调用(*p)()
。您的第二个错误表达式p
尝试使用两个参数调用(*p)(args[0], args[1])
。
参数的数量必须与参数的数量相匹配,因此这两个参数都是格式错误的,就像尝试直接调用p
而没有参数或两个参数一样会导致编译错误。< / p>
答案 1 :(得分:1)
@JamesMcNellis已经解决了代码问题。
要做出像这样的工作,你可能想做类似的事情:
bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) {
bool ret = true;
for (int i=0; i<args.size(); i++)
ret &= p(args[i]);
return ret;
}
...或者,你可以使用std :: for_each(因为你还没有使用它,我暂时会忽略返回值):
// avoid copying vector by passing reference to const vector.
void call_user_function(bool (*p)(std::string), std::vector<std::string> const &args) {
std::for_each(args.begin(), args.end(), p);
}
...但是,既然您只是打印出矢量的内容,那么您应该使用的更像是:
std::copy(a.begin(), a.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
另请注意,您的a[0] = "test";
无效。您想要a.push_back("test");
。
答案 2 :(得分:0)
print
没有重载。
print
也没有两个std::string
参数的重载。