Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板_C++_Templates_Function Templates - Fatal编程技术网

C++ 函数模板

C++ 函数模板,c++,templates,function-templates,C++,Templates,Function Templates,我被告知要创建函数模板,该模板将包含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 &

我被告知要创建函数模板,该模板将包含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;
}
#包括
使用名称空间std;
无整数(整数a)
{
返回a;
}
模板T函数(int*L,int&M,char*K,int(*P)(int))
{

但是,在C++中,引用用<代码>和<代码>(不是<代码> $>代码>)表示,指向数组的指针是指向其第一个元素的指针,函数指针需要附加的括号:<代码> t(*pf)(<)/c> > /p> 请注意,它被称为函数模板(与类模板相反)

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

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

请注意,对于函数指针,有1..N个类型、一个结果类型和0..N个参数类型。“创建一个函数模板以获取指向函数的指针”可以指任何类型。或者

template< typename F >
void f(F func);
模板
无效f(f func);

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

为了帮助您,请记住获取参数的“main”函数的外观,这将帮助您了解如何创建指向数组的指针。

您现在还有一些问题

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;
char* b = 0;
f(a, b);
编译器实例化并调用函数

void f<int>(int*, int*);
应该叫什么

void f<int> (int*,  int* ); // doesn't match, 2nd argument is char*
void f<char>(char*, char*); // doesn't match, 1st argument is int*
void f(int*,int*);//不匹配,第二个参数是char*
void f(char*,char*);//不匹配,第一个参数为int*

我起初喜欢这个提示,但后来我记得这是一个指针数组。因此,我担心这对初学者来说不是很有帮助。@sbi你是对的,但它是有效的,这是一种语言问题(数组与指向第一个元素的指针)。还有大小,你应该将大小作为附加参数传递,顺便说一句,我不认为“函数模板”是“模板函数”,而不是模板,它是如何创建函数的。根据C++的学习水平,您的教授可能只需要签名而不是模板函数。现在我正在尝试:模板int FUNC(int *L,int & m,char *k,int(*p)(int))。{cout@anotr67:不,我不是想更改函数,而是想想象一下当编译器将
类型
替换为例如
int
时,它会是什么样子。这可能有助于理解为什么会得到“不匹配函数”。正如sbi所指出的,不要只是以一种让已经给出的答案看起来是错误的方式编辑你的问题。
void f<int> (int*,  int* ); // doesn't match, 2nd argument is char*
void f<char>(char*, char*); // doesn't match, 1st argument is int*