在模板函数中调用返回模板类型的模板函数为何编译失败?
模板函数参数推导的差异解析
第一个代码编译失败的原因
先看报错的代码:
template<typename T> T* func ( void ) { return NULL; } template<typename T> T* func2 ( void ) { T* var = func(); // 编译报错位置 return NULL; }
编译报错error: no matching function for call to ‘func()’,核心问题在于模板参数的推导规则:模板函数的类型参数T需要从函数调用的实参中推断,但func()是无参调用,没有任何实参能让编译器确定T的具体类型。此时必须显式指定模板参数,把调用改成func<T>()才能让编译器匹配到对应的模板实例。
第二个代码编译成功的原因
再看能正常编译的代码:
template<typename T> void func ( T var ) { return; } template<typename T> void func2 ( T var ) { func( var ); // 可正常推导 }
这里调用func(var)时,var的类型是func2模板参数中的T,编译器可以通过这个实参的类型,自动推导出func的模板参数T与func2的T一致,因此不需要显式指定模板参数,就能正确匹配并实例化模板函数。
关键总结
- 无参模板函数调用时,没有实参可供推导类型,必须显式指定模板参数(如
func<T>()) - 带参模板函数调用时,编译器可通过传入的实参类型自动推导模板参数
内容的提问来源于stack exchange,提问作者Mikolaj
相关产品推荐
相关产品推荐

