参数太多,函数指针中的参数太少

时间:2012-07-25 23:07:49

标签: c++ function-pointers

我正在尝试从基础知识中学习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(**):错误:函数的参数太多

我做错了什么?

3 个答案:

答案 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参数的重载。