Шаблонные классы и перегрузка операторов

Как мне перегрузить класс шаблона, как показано ниже?

template <class T>
const_iterator& List<T>::const_iterator::operator++()
{
  current = current->next;
  return *this;
}

template <class T>
const_iterator List<T>::const_iterator::operator++(int)
{
  const_iterator old = *this;
  ++( *this );
  return old;
}

Я получаю ошибки, как показано ниже:

List.cpp:17: error: expected constructor, destructor, or type conversion before ‘&’ token
List.cpp:23: error: expected constructor, destructor, or type conversion before ‘List’
List.cpp:30: error: expected constructor, destructor, or type conversion before ‘&’ token
List.cpp:35: error: expected constructor, destructor, or type conversion before ‘List’

1 ответ

Решение
template <class T>
typename List<T>::const_iterator& List<T>::const_iterator::operator++()

Когда указан тип возврата, вы не находитесь в так называемой лексической области видимости. List<T>, И так как нет типа const_iterator во вложенной области видимости вы получаете ошибку (хотя она может проявиться немного лучше, ИМХО).

Другой вариант для C++11 может быть конечным типом возврата:

template<class T>
auto List<T>::const_iterator::operator++()
    -> const_iterator&
{
  // ...
}

Тем не менее, лучшей идеей было бы просто определить эти вещи встроенными в самом классе. У вас есть особая причина для внеклассных определений?

Другие вопросы по тегам