9.30

1.在C/C++语言中,函数名代表函数的入口地址,那么我们可以将这个地址放在一个指针变量中,这个指针变量就是指向函数的指针,如下代码:

int add(int a, int b); //返回a, b之和

int (*ptrfun)(int a, int b);  //ptrfun是指向函数的指针

ptrfun=add; //赋值

ptrfun(1,3); //调用

或者以另一种形式赋值:

int (*ptrfun)(int a, int b)=add;

这里我们写了一个关于加法的函数模板:

template<typename T>

T add(const T &a, const T &b)

{

      return a+b;

}

int (*pfun)(const int &a ,const int &b)=add;

//此时编译器在会以整型来实例化函数模板

如果编译器不能从函数指针类型(如上例中的函数指针所指函数有整型参数)推断出函数模板的类型,那么编译器就会报错。如下例:

template<typename T>

T add(const T &a, const T &b)

{

      return a+b;

}

//定义重载函数func,注意此这两个func函数的参数分别是指向不同函数的指针

void func(int (*)(const int&, const int&));

 //指向两个整型数相加函数

void func(string (*)(const string&, conststring&));

//指向两个字符串连接函数

func(add); //编译器报错

//error C2668: 'func' : ambiguous call to overloadedfunction

原因分析:当执行func(add)时,要进行参数传递,相当于

func=add,此时的func有两种类型,编译器无法推断出模板函数add的类型,所以编译器报错。

原文地址:https://www.cnblogs.com/xiebiandreamhigh/p/3346930.html