конструктор шаблона и итератор typedef - PullRequest
1 голос
/ 04 марта 2012

Я хочу определить конструктор, работающий с любым конструктором, имеющим оператор начала, конца, оператора ++. Другими словами, я хочу получить это поведение (комментарий, рабочий код):

/*Polyn(std::vector<double> &a) : CalcDerivative(0) , CalcIntegral(0) {
    for(std::vector<double>::iterator i = a.begin();i < a.end();++i)
      params.push_back(*i);
    }*/

с другими итераторами. (например, списки тоже).

template <typename T>
  Polyn(const T &a) : CalcDerivative(0) , CalcIntegral(0) {
  typename std::vector<T>::iterator iter;
  for(iter i = a.begin();i < a.end();++i) //LINEA 18!!
    params.push_back(*i);
  }

Что я получаю, это ошибка компиляции:

polyn.h: In constructor ‘Polyn::Polyn(const T&)’:
polyn.h:18: error: expected ‘;’ before ‘i’

почему? Как исправить мой код?

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Прежде всего, тип параметра функции должен быть std::vector<T> const &, а не T const &. И тогда вы должны использовать const_iterator:

typename std::vector<T>::const_iterator iter;

Поскольку вектор a является константным объектом.

Еще лучше, если вы реализуете конструктор как:

template <typename T>
Polyn(const std::vector<T> &a) 
  : params(a.begin(), a.end()), CalcDerivative(0) , CalcIntegral(0) 
{
}

То есть инициализировать params в самом списке инициализации участника.

1 голос
/ 04 марта 2012

В дополнение к ответу Наваза, если вы хотите поддерживать любой тип контейнера, поддерживающий начало, конец и прямой итератор, вы можете использовать:

template <typename C>
Polyn(const C &a) 
  : params(a.begin(), a.end()), CalcDerivative(0) , CalcIntegral(0) 
{
}

Таким образом, он также работает для std::listс и std::maps и все такое.Или, имея поддержку C ++ 11, вы на самом деле должны использовать даже более общие std::begin(a) и std::end(a), так что это будет работать даже для простых массивов или чего-то еще, специализирующегося на std::begin и std::end.

Другой вариант, немного более похожий на STL, состоит в том, чтобы напрямую использовать итераторы в качестве аргументов, но тогда вам придется начинать / заканчивать вручную в клиентском коде (при вызове конструктора):

template <typename InputIterator>
Polyn(const InputIterator &b, const InputIterator &e) 
  : params(b, e), CalcDerivative(0) , CalcIntegral(0) 
{
}
...