模板的一些问题

时间:2014-10-18 09:53:36

标签: c++ templates iterator

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);

然后没有错误。 任何人都可以向我解释一下吗?

2 个答案:

答案 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);

没有参考。