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的类型,所以编译器报错。