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 (*): エラー: 機能する引数が少なすぎます

main.cpp:32 (**): エラー: 機能する引数が多すぎます

私は何を間違っていますか?

4

3 に答える 3

3

pタイプbool(*)(std::string)です。これは、型の単一のパラメーターを持ち、std::stringを返す関数へのポインターであることを意味しますbool

pprintタイプが一致するため、を指すことができますprint。これは、タイプの単一のパラメーターを持ち、std::stringを返す関数ですbool

最初の誤った式、は、引数なし(*p)()で呼び出そうとします。p2番目の誤った式は、2つの引数で (*p)(args[0], args[1])呼び出そうとします。p

print引数の数はパラメータの数と一致する必要があるため、引数なしまたは2つの引数を使用して直接呼び出そうとするとコンパイルエラーが発生するのと同じように、どちらも形式が正しくありません。

于 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";また、 yourは無効であることに注意してください。a.push_back("test");代わりに欲しい。

于 2012-07-25T23:22:13.973 に答える
0

print引数のない呼び出しのオーバーロードはありません。

printstd::stringまた、2 つの引数に対するオーバーロードもありません。

于 2012-07-25T23:12:54.827 に答える