Как вы возвращаете векторный итератор из переменной в шаблонном классе? - PullRequest
1 голос
/ 08 января 2009

Я пытаюсь вернуть итератор для вектора в шаблонном классе (я не уверен, что это имеет значение, но я читал, что может, поэтому я думал, что упомяну это). Проблема в том, что я получаю ошибку о том, что C ++ не поддерживает default-int, когда я пытаюсь это сделать. Я смотрел в Интернете, и из того, что я вижу на форумах и в объяснениях, я не думаю, что я что далеко, он просто не скомпилируется.

template<class T>
class Table
{
public:
  ...

  vector<shared_ptr<vector<T>>>::iterator GetRowIterator();
  //vector<shared_ptr<vector<CellValueType> > >::const_iterator GetRowIterator();

  ...
protected:

  vector<shared_ptr<vector<CellValueType> > > data;  //outside vector is rows, inside vector is columns

  ...
};

vector<shared_ptr<vector<T> > >::const_iterator Table<T>::GetRowIterator()
{
  return data.begin();
}

Я получаю следующие ошибки:

error C2146: syntax error : missing ';' before identifier 'GetRowIterator'

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   

Edit:
Изменены концевые угловые скобки, чтобы они не были так близко друг к другу - та же ошибка.

Есть мысли, почему это происходит?
Как всегда, спасибо за совет / помощь заранее!

Ответы [ 2 ]

4 голосов
/ 08 января 2009

Также не забудьте использовать typename при объявлении зависимого от шаблона типа возвращаемого значения:

typename vector< shared_ptr< vector< T > > >::iterator GetRowIterator();

и определение метода

typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
{
  return data.begin();
}

Обратите внимание, что при определении метода класса шаблона вне определения класса необходимо использовать ключевое слово шаблона:

template <class T> typename vector< shared_ptr< vector< T > > >::const_iterator Table<T>::GetRowIterator()
    {
      return data.begin();
    }

Чтобы компилятор мог знать, что такое T.

3 голосов
/ 08 января 2009

Эта часть здесь:

vector<shared_ptr<vector<T>>>

Это проблема с синтаксисом C ++, которую вы не можете >> собрать вот так.

vector<shared_ptr<vector<T> > >

Эта проблема решается новым стандартом.

Поскольку лексер является первой ступенью компилятора, он видит >>> как оператор сдвига влево, за которым следует>. Таким образом, вы получаете синтаксические ошибки в вашем коде. Чтобы устранить эту проблему, вам просто нужно добавить пробел между> при закрытии шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...