一个典型的函数模板签名:
template<typename Iterator, typename T>
T fn(Iterator first, Iterator last, T init)
{
T result;
// ...
return result;
}
问题是,当我这样称呼它时:
std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
或任何其他没有明确调用的方式
fn<std::vector<long>::iterator, long>(data.begin(), data.end(),0);
那么 T 的类型是int
,并且存在溢出和错误结果的风险fn
。
那么我该如何专门fn
化以便调用
fn(data.begin(), data.end(), 0);
是明确的并导致T
设置为Iterator::value_type
? 选择
template<Iterator>
typename iterator_traits<Iterator>::value_type fn(Iterator first, Iterator last, typename iterator_traits<Iterator>::value_type init)
{
//...
}
导致来自 g++/clang++ 的模棱两可的调用错误。
编辑:
我现在看到了我的错误,上面的代码适用于下面的@Lightness Races 建议。谢谢您的帮助。