2014-10-15 2 views
4

Я реализую пример из книги «A Tour of C++» Бьярна Страуструпа. У меня есть шаблон функция для вычисления суммы элементов (скопированную из книги):диапазон для цикла с проблемой контейнера const

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

это приводит к ошибке компиляции. Однако, когда я удаляю const из функции шаблона суммы

template<typename Container, typename Value> 
Value sum(Container& c, Value v) 

скомпилирован.

1 - Почему это не сработало с "const"? Если это проблема с реализацией «begin», «end», как их реализовать?

ответ

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 его нет (сомнительно), его следует добавить.

+0

Это работает! Спасибо! Это отсутствует в книге и должно быть добавлено к ошибкам. – adel