2

我被告知要创建函数模板,这将需要 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) 调用存储在pf. pf已经一个函数指针,所以按原样传递它。
(另外,在您的声明P中是一个采用X,而pf采用 的函数int。我想这是一个编辑错误?)

请注意,对于函数指针,涉及 1..N 种类型、一种结果类型和 0..N 种参数类型。“创建一个将指向函数的指针的函数模板”可能意味着任何一个。或者这意味着

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

可以用任何函数指针调用。

于 2010-04-27T10:14:09.533 回答
1

你现在还有一些问题......

TYPE (*P)(x)说你期望一个指向函数的指针,它接受一个类型的参数x- 将它更改为现有类型。

在表达式中func(z, y, c, pf(x)),您尝试调用函数指针pf而不是仅仅传递它。

然后,您func使用基于不同类型的参数调用前 3 个参数intchar, 但func希望它们基于相同的类型。
尝试写下func将调用的类型,并尝试将其funcTYPE替换为 say的签名匹配int

例如,如果您有以下情况:

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 回答
1

为了帮助你更多一点,试着记住“主”函数接受参数的样子,这将帮助你了解如何创建指向数组的指针。

于 2010-04-27T10:21:38.960 回答