2

function のテンプレートを作成するように言われました。これには 4 つの引数が必要です。

  • ポインタ
  • 参照
  • 配列へのポインタ
  • 関数へのポインタ

このタスクの実行方法 やってみた :

#include <iostream>
using namespace std;

int nothing(int a)
{
    return a;
}

template<typename T> T func(int *L, int &M, char *K, int (*P)(int))
{
    cout << L << "," << M << "," << K[0] << "," << P() << endl;
    return 0;    
}

int main()
{
    int x = 3;
    int *z = &x;
    int &y = x;
    char c[3];
    int (*pf)(int) = nothing;

    cout << "some result of func" << func(z, y, c, pf) << endl;

    system("pause");
    return 0;
}

これにより、「一致する関数がありません。「pf」の場合だと思います。また、pf内で何を渡すかを制御できないか、間違っていますか?

4

3 に答える 3

3

あなたはほとんどそこにいます。ただし、C++ では、参照は&(not $) で示され、配列へのポインターは最初の要素へのポインターであり、関数ポインターには追加の括弧が必要ですT (*pf)()

これは関数テンプレート(クラス テンプレートではなく) と呼ばれることに注意してください。

編集:(これまでに与えられた回答が突然無意味になるように、質問を編集しないでください。)

pf(x) に格納されている関数を呼び出しますpfpfすでに関数ポインタになっているので、そのまま渡します。 (また、あなたの宣言では、を取る関数ですが、これは編集エラーですか?)
PXpfint

関数ポインターには、1..N の型、1 つの結果の型、および 0..N の引数の型が含まれることに注意してください。「関数へのポインターを受け取る関数テンプレートを作成する」は、そのいずれかを意味します。またはそれは意味します

template< typename F >
void f(F func);

これは、任意の関数ポインターで呼び出すことができます。

于 2010-04-27T10:14:09.533 に答える
1

もう少し役立つように、引数を取る「main」関数がどのように見えるかを覚えておいてください。これは、配列へのポインターを作成する方法を確認するのに役立ちます。

于 2010-04-27T10:21:38.960 に答える
1

あなたには今、いくつかの問題が残っています...

TYPE (*P)(x)型の引数を取る関数へのポインタが必要だと言っていますx- 既存の型に変更してください。

式では、単に渡すのではなくfunc(z, y, c, pf(x))、関数ポインターを呼び出そうとします。pf

次に、最初の 3 つのパラメーターとfuncの異なる型に基づいたパラメーターを使用して呼び出していますが、それらが同じ型に基づいていることを期待しています。 どのタイプが呼び出されるかを書き留めて、それを署名に一致させて、 say に置き換えてみてください。intcharfunc
funcfuncTYPEint

たとえば、次の場合:

template<typename T> void f(T* a, T* b);

そして、次のように呼び出してみてください:

int* a = 0;
int* b = 0;
f(a, b);

コンパイラは関数をインスタンス化して呼び出します

void f<int>(int*, int*);

ただし、次のようにすると:

int*  a = 0;
char* b = 0;
f(a, b);

何と呼ぶべきですか?

void f<int> (int*,  int* ); // doesn't match, 2nd argument is char*
void f<char>(char*, char*); // doesn't match, 1st argument is int*
于 2010-04-27T10:38:34.417 に答える