C++ 模板的一些问题
我收到错误消息:void Generate(const-TypeIterator&,const-TypeIterator&)':模板参数“TypeIterator”不明确 当我使用:C++ 模板的一些问题,c++,templates,iterator,C++,Templates,Iterator,我收到错误消息:void Generate(const-TypeIterator&,const-TypeIterator&)':模板参数“TypeIterator”不明确 当我使用: PhanSo arr[10]; Generate(arr, arr+10); 然后我的程序成功了 我试图通过删除函数参数中的“&”来修复它 PhanSo arr[10]; Generate(&arr[0], &arr[10]); 模板 void Generate(const TypeIterat
PhanSo arr[10];
Generate(arr, arr+10);
然后我的程序成功了
我试图通过删除函数参数中的“&”来修复它
PhanSo arr[10];
Generate(&arr[0], &arr[10]);
模板
void Generate(const TypeIterator first,const TypeIterator last);
那么就没有错误了。
有人能给我解释一下吗?当你调用
Generate(arr,arr+10)代码>
第一个
将是constphanso(&)[10]
- 但是
second
衰减到指针:constphanso*
因此类型不匹配
因为数组不能通过值arr
传递给指针
template<class TypeIterator>
void Generate(const TypeIterator first, const TypeIterator last);
模板
void Generate(const TypeIterator first,const TypeIterator last);
无引用。数组不是指针。用作指向数组第一个元素的指针的数组名称只是语法糖衣
当模板参数是引用类型时,
数组到指针的转换将不会发生
当您使用Generate(arr,arr+10)调用void Generate(const-TypeIterator&first,const-TypeIterator&last)
时
,arr
解析为PhanSo[10]
,而arr+10
解析为PhanSo*
,这实际上被G++和Microsoft编译器都指出是模糊的
当使用Generate(&arr[0],&arr[10])调用void Generate(const-TypeIterator&first,const-TypeIterator&last)
时对于编译器来说,事情变得更清楚了,因为您专门为函数提供了元素的地址,因此TypeIterator解析为PhanSo*
最后,当您使用Generate(arr,arr+10)调用void Generate(const-TypeIterator first,const-TypeIterator last)
时
,因为模板参数不再是引用类型,所以会发生常规数组到指针的转换,TypeIterator
解析为PhanSo*
感谢您的阅读。请注意,您正在尝试访问超出数组边界的内容:arr[10]
。最后一个有效索引位于arr[9]
@user207933arr+10
是完全合法的,因为只要不取消引用,您就可以使用1-pass-The-end迭代器arr[10]
调用UB。arr+10
可以用作数组中最后一个元素的迭代器,只要不取消引用就可以了。示例:while(ptr!=last)
其中last指向arr+10
Ah当然是的。我修正了评论。@user2079303很抱歉再次打扰您,但到目前为止,没有人试图访问arr[10]
。谢谢您的解释。这真的很有帮助,没问题。我真的很高兴它帮助了你。我只是被老师教得很好。谢谢你回答我的问题D
template<class TypeIterator>
void Generate(const TypeIterator first, const TypeIterator last);
template<class TypeIterator>
void Generate(const TypeIterator first, const TypeIterator last);