Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板的一些问题_C++_Templates_Iterator - Fatal编程技术网

C++ 模板的一些问题

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

我收到错误消息: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 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]
@user207933
arr+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);