template<class TypeIterator>
void Generate(const TypeIterator& first, const TypeIterator& last)
{
//do something
}
当我试图像这样调用generate函数时:
PhanSo arr[10];
Generate(arr, arr+10);
我收到错误消息: void Generate(const TypeIterator&amp;,const TypeIterator&amp;)':模板参数'TypeIterator'不明确
我用的时候:
PhanSo arr[10];
Generate(&arr[0], &arr[10]);
然后我的程序建成了。
我尝试通过删除“&amp;”来修复它在函数参数
中template<class TypeIterator>
void Generate(const TypeIterator first, const TypeIterator last);
然后没有错误。 任何人都可以向我解释一下吗?
答案 0 :(得分:1)
数组不是指针。数组的名称用作指向数组第一个元素的指针,只是语法糖衣。
当模板参数是参考类型时, 数组到指针的转换不会发生。
当您使用void Generate(const TypeIterator& first, const TypeIterator& last)
调用Generate(arr, arr+10);
时,arr
会解析为PhanSo[10]
而arr+10
会解析为PhanSo*
,这实际上是指向的G ++和Microsoft编译器都表示不明确。
当您使用void Generate(const TypeIterator& first, const TypeIterator& last)
调用Generate(&arr[0], &arr[10]);
时,编译器的内容变得更加清晰,因为您专门为函数提供元素的地址,因此TypeIterator可以解析到PhanSo*
。
最后,当您使用void Generate(const TypeIterator first, const TypeIterator last)
调用Generate(arr, arr+10);
时,因为模板参数不再是引用类型,所以正常数组到发生-pointer转换,TypeIterator
解析为PhanSo*
。
感谢您的阅读。
答案 1 :(得分:0)
致电Generate(arr, arr+10);
first
将是const PhanSo (&)[10]
。second
朽烂指针:const PhanSo *
。所以类型不匹配。
当你有
时,数值不能通过值arr
传递给指针
template<class TypeIterator>
void Generate(const TypeIterator first, const TypeIterator last);
没有参考。