最近在学习参数包的使用,在使用递归进行参数包解析的时候,遇到了一个问题,不太明白,想要请教一下C++的大能:
先上代码:
//设置递归终点, 当参数包解包完全, 适配空包 Start
void ShowList()
{
cout << endl;
}
//递归形式调用解包, 每一次解出一个参数
template<class T, class ...Args >
void ShowList(T& val, Args... args)
{
static int num = 0;
cout << "【" << ++num << "】:" << val << ",type:" << typeid(val).name() << endl;
ShowList(args...);
cout << "【" << num << "】:End" << endl;
//if (sizeof...(args) == 0)
//{
// ShowList();
//}
}
// 参数包解析 End
int main()
{
ShowList(1, 2, 3.4, "dsadsa", 2, 5, 6, "edsad", 4.8, 'q', 'w');
return 0;
}
以上代码在编译的时候出现编译错误"error C2665: “ShowList”: 2 个重载中没有一个可以转换所有参数类型"。我测试过在函数ShowList()中的参数包只有当第一个参数为字符串的时候,后面无论什么类型都可以正常执行;但如果第一个参数是int、double、char这些基础类型常量的时候,都会出错。
后来我修改了一下代码:
int main()
{
//ShowList(1, 2, 3.4, "dsadsa", 2, 5, 6, "edsad", 4.8, 'q', 'w');
int n = 5;
double d = 4.5;
string str = "Hello";
char c = 'c',
ShowList(n/*d*//*c*/, 2, 3.4, "dsadsa", 2, 5, 6, "edsad", 4.8, 'q', 'w');
return 0;
}
分别定一个变量存放int、double、char的数据,然后将其放在ShowList()函数的第一个参数,再编译执行都可以正常输出。
所以这是为什么呢?是因为直接使用常量,无法判断类型嘛?但看错误提示其实已经识别出这些常量的类型了,只是说没有与参数列表匹配的重载函数实例?
----------------------------------------------- 分割线 --------------------------------------------
最近人工智能流行,我就找了一个相关的人工智能帮查找上面的问题,可以给大家看看聊天记录:
代码还是上面的代码我就不截图了;