【问题标题】:templates of functions函数模板
【发布时间】:2010-04-27 10:11:22
【问题描述】:

我被告知要创建函数模板,它需要 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 中传递什么或者我错了吗?

【问题讨论】:

  • 正如 sbi 指出的那样,不要只是编辑您的问题,使已经给出的答案看起来错误。

标签: c++ templates function-templates


【解决方案1】:

你快到了。但是,在 C++ 中,引用用&amp;(而不是$)表示,指向数组的指针是指向其第一个元素的指针,而函数指针需要额外的括号:T (*pf)()。

注意它被称为函数模板(相对于类模板)。

编辑:(你不应该编辑你的问题,以至于到目前为止给出的答案突然变得毫无意义。)

pf(x) 调用存储在pf 中的函数。 pf 已经是一个函数指针,所以按原样传递它。
(另外,在您的声明中,P 是一个采用 X 的函数,而 pf 采用 int。我想这是一个编辑错误?)

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

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

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

【讨论】:

  • 和尺寸,您应该将尺寸作为附加参数传递
  • 顺便说一句,我不认为“函数模板”是指“模板化函数”,而是作为如何创建函数的模板。根据您对 C++ 的学习水平,您的教授可能只是要求签名而不是模板函数。
【解决方案2】:

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

【讨论】:

  • 我最初喜欢这个提示,但后来我记得这是一个 指针数组。所以恐怕这对初学者并没有真正的帮助。
  • @sbi 你是对的,但它有效,而且它是恕我直言的语言问题(数组与指向第一个元素的指针)。
【解决方案3】:

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

TYPE (*P)(x) 表示您需要一个指向函数的指针,该函数接受 x 类型的参数 - 将其更改为现有类型。

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

然后您调用func,前3个参数int和char的参数基于不同类型,但func希望它们基于相同类型。
尝试写下func 将被调用的类型,并尝试将其与func 的签名相匹配,并将TYPE 替换为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*

【讨论】:

  • 现在我在尝试:template int func(int *L, int &M, char *K, int (*P)(int)) { cout
  • @anotr67:不,我不是要更改函数,而是想像一下当编译器将 TYPE 替换为例如int。这可能有助于理解为什么您会得到“no matching function”。
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多