0

我正在尝试从基础开始学习 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 (*): error: too little arguments to function

main.cpp:32 (**): 错误:函数参数太多

我究竟做错了什么?

4

3 回答 3

3

p是类型bool(*)(std::string)。这意味着它是一个指向函数的指针,该函数具有一个类型的参数std::string并返回一个bool.

p可以指向print,因为print匹配的类型:它是一个函数,它有一个类型的参数std::string并返回一个bool.

您的第一个错误表达式 ,(*p)()尝试p不带参数调用。您的第二个错误表达式,(*p)(args[0], args[1])尝试p使用两个参数进行调用。

参数的数量必须与参数的数量相匹配,因此它们都是格式错误的,就像尝试print不带参数或带两个参数直接调用会导致编译错误一样。

于 2012-07-25T23:10:56.133 回答
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");

于 2012-07-25T23:22:13.973 回答
0

print对于没有参数的调用没有重载。

print也没有两个std::string参数的重载。

于 2012-07-25T23:12:54.827 回答