我正在实施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)
它编译。</ p>
1-为什么它不能与“const”一起使用?如果它是“开始”,“结束”实现的问题,如何实现它们?
答案 0 :(得分:2)
这些是begin
和end
的唯一版本吗?请注意,他们通过引用非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
const
超载operator[]
。这是一个非常合理的要求;如果原始Vector
没有它(可疑),你应该添加它。