我正在实施Bjarne Stroustrup的“A Tour of C”一书中的一些例子.
我有一个模板函数来计算元素的总和(从书中复制):
template<typename Container, typename Value>
Value sum(const Container& c, Value v)
{
for (auto x : c)
v+=x;
return v;
}
我想将它应用于模板类Vector(在书中定义),它具有“开始”和“结束”函数以支持范围循环(从书中复制):
template<typename T>
T∗ begin(Vector<T>& x)
{
return x.size() ? &x[0] : nullptr;
}
template<typename T>
T∗ end(Vector<T>& x)
{
return begin(x)+x.size();
}
当应用于Vector时,例如:
Vector<int> v={1,2,3,4};
int s=sum(v, 0);
这导致编译错误.但是,当我从sum模板函数中删除const时
template<typename Container, typename Value>
Value sum( Container& c, Value v)
它汇编.
1-为什么它不能与“const”一起使用?如果是“开始”,“结束”实现的问题,如何实现它们?
最佳答案 这些是开始和结束的唯一版本吗?请注意,他们通过引用非const来获取向量.要进行sum编译,还应该添加const重载:
template<typename T>
const T∗ begin(const Vector<T>& x)
{
return x.size() ? &x[0] : nullptr;
}
template<typename T>
const T∗ end(const Vector<T>& x)
{
return begin(x)+x.size();
}
请注意,这需要Vector具有operator []的const重载.这是一个非常合理的要求;如果原始Vector没有它(可疑),你应该添加它.