C++可变参数模板递归调用报无匹配test()错误如何解决
报错原因
- 可变参数模板的递归展开必须有终止条件:当参数包
args在递归过程中被逐步拆包到空的时候,你的代码会尝试调用无参的test(),但你没有定义这个函数,因此函数匹配失败触发报错。 - 你提到的adder模板可以正常运行,是因为你参考的示例里配套提供了单参数的终止版本重载,示例如下:
// adder的递归终止重载 template<typename T> T adder(T last) { return last; }
没有这个终止重载的adder和你当前写的test函数一样,会触发类似的匹配失败报错。
修复方案
提供两种常用的修复方式:
方式1:新增终止重载(适配所有C++11及以上版本)
在原有test模板上方新增一个无参的test空实现作为递归终止入口即可:
// 递归终止函数:参数包为空时调用 void test() {} template<typename T, typename ...Args> void test(T first, Args... args) { cout << sizeof(first) << '\n'; test(args...); }
方式2:C++17及以上版本用if constexpr做编译期判断
无需单独编写终止函数,在递归调用前加编译期分支判断即可:
template<typename T, typename ...Args> void test(T first, Args... args) { cout << sizeof(first) << '\n'; if constexpr (sizeof...(args) > 0) { test(args...); } }
这种方式会在编译期判断参数包是否还有剩余元素,没有剩余的情况下不会生成递归调用的代码,自然不需要单独编写终止函数。
内容的提问来源于stack exchange,提问作者Dov
相关产品推荐
相关产品推荐

