首页 > 试题广场 >

定义函数模板add,以下说法正确的有:()

[不定项选择题]
定义函数模板add,以下说法正确的有:()
template<typename T>
T add(T &x,T &y)
{
    return x+y;
}
const int (*pfun1)(const int &a ,const int &b);
const int (*pfun2)(int &a ,int &b);
int(*pfun3)(const int &a ,const int &b);
int(*pfun4)(int &a, int &b);




  • pfun2 = add失败,需要显示定义为pfun2 = add<int>
  • pfun1 = add
  • pfun3 = add失败,add无法正确推导
  • pfun4 = add<int>失败,函数指针不可赋值
注意返回值和参数的类型一致,const int 与 int 不是同一类型。
另外,函数模板调用时不需要显式指定类型,系统自动匹配参数类型,若没有合适的,会进行报错。而类模板使用需要显式指定类型。
发表于 2017-08-13 13:34:47 回复(3)

A:pfun2 = add的错误提示不是pfun2 = add,而是 no matches converting function 'add' to type 'const int (*)(int&, int&);

B:pfun1的参数和返回值一致,可以自动推导,正确赋值;

C:pfun3 = add赋值失败,失败原因和A一样;

D:pfun4 = add显示的指定类型T为int型,赋值正确。

发表于 2017-11-28 11:44:17 回复(2)

模版推断的时候int可以转换为const int,反过来不行。另外数组可以转换为指针。

发表于 2019-09-08 12:45:25 回复(0)
//在VS2017上跑的结果,pfun1 = add不行。。。想听大佬解释

template<typename T>
T add(T &x, T &y)
{
	return x + y;
}

int main()
{
	const int(*pfun1)(const int &a, const int &b);
	const int(*pfun2)(int &a, int &b);
	int(*pfun3)(const int &a, const int &b);
	int(*pfun4)(int &a, int &b);

	pfun1 = add; //(1)错误C2568:“ = ”: 无法解析函数重载;(2)错误C2563:在形参表中不匹配
	//pfun2 = add; //错误,没有与所需类型匹配的函数模板“add”实例
	//pfun3 = add; //错误,没有与所需类型匹配的函数模板“add”实例
	pfun4 = add; //正确

	system("pause");
	return 0;
}


编辑于 2019-11-15 15:08:38 回复(0)
类型都是T,因此只有1 4可以。
发表于 2017-08-15 10:14:23 回复(0)
怎麼覺得老是題目在考驗的是編譯器的程度不是工程師的程度?可以,但⋯不應該這樣寫,我相信某些編譯器上,正確答案有的會報錯,如果你開發template library這樣寫,你就死定了。
发表于 2021-02-21 05:37:32 回复(0)
add函数需要返回值,参数1,参数2同类型
发表于 2019-08-14 08:29:53 回复(0)
B选项在vs2022中无法通过
发表于 2023-05-08 22:08:08 回复(0)
B项真的可以么,好像引用和常引用之前没办法强制转换吧
发表于 2020-04-24 08:36:21 回复(0)
A选项:错误,没有与所需类型匹配的函数模板"add"实例,也就是pfun2与add参数不匹配
B选项:错误,无法解析函数重载
C选项:正确
D选项: 错误,pfun4与add参数匹配,函数指针可以正确赋值
编辑于 2020-04-12 11:24:26 回复(0)
注意函数模板的类型匹配,返回值个参数值
发表于 2019-02-11 19:40:26 回复(0)
标记
发表于 2018-03-12 12:00:57 回复(0)
D选项是什么意思
发表于 2017-11-08 15:11:52 回复(0)
注意类型,const int 和 int不是同一类型的
发表于 2017-09-20 21:30:13 回复(0)