C++ 模板类型确定问题

flying_music 2020-03-07 07:30:47
大神帮忙看一下下面的代码为什么不能编译通过

#include <iostream>
#include <string>

using namespace std;

template <typename Type>
void printElements(const Type& col)
{
for(const auto &item : col){
cout << item << endl;
}
}

int main()
{
auto a = {1, 2, 3, 4};
printElements(a); //OK
printElements({1, 2, 3, 4}); //ERROR: couldn't deduce template parameter ‘Type’
return 0;
}

既然auto可以推导出{1,2,3,4}的类型,然后调用printElements函数,那下面直接用{1,2,3,4}去调用就会提示不能确定类型呢?
...全文
232 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-03-10
  • 打赏
  • 举报
回复
不是缺陷,例如 struct M{ int x, int y }; template <typename T> void func(T m) { M x=m; } ..... func({1,2});//因为没有指定类型,则把它初始化为initializer_list,那么下面的语句将是错误的。
flying_music 2020-03-08
  • 打赏
  • 举报
回复
多谢各位回复,看完后我最终理解是这样的,{1, 2, 3}虽然在很多情况下被推导为std::initializer_list<int>,比如函数参数传递、auto推导时,但在模板类型推导时,它并非默认为std::initializer_list<int>类型,这个可能有设计上的考虑,也有可能是缺陷,总之,它不像5的类型是int,5.0的类型是double这样直接明了,而是需要更具体的上下文环境。
真相重于对错 2020-03-07
  • 打赏
  • 举报
回复
上边的b,改为int b[]={1,2},也就是说{1,2},要根据他所要初始化的对象来确定类型,所以它本身没有类型。
真相重于对错 2020-03-07
  • 打赏
  • 举报
回复
例如有如下代码 struct A { int _a; int _b; }; 下面两个语句 A a={1,2}; int b={1,2}; 都是合法的,那么你怎么确定{1,2}到底是A类型,还是int [];
qybao 2020-03-07
  • 打赏
  • 举报
回复
{} 这样的形式在变量初始化的时候可用,否则就是代码块。 比如 {printf(“”);} 这样的形式,lz觉得还是类型吗?
真相重于对错 2020-03-07
  • 打赏
  • 举报
回复
百度一下列表初始化

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧