基于范围的for循环与const容器问题

时间:2014-10-15 14:33:33

标签: c++11

我正在实施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”一起使用?如果它是“开始”,“结束”实现的问题,如何实现它们?

1 个答案:

答案 0 :(得分:2)

这些是beginend的唯一版本吗?请注意,他们通过引用非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没有它(可疑),你应该添加它。