2

以下のようにテンプレートクラスをオーバーロードするにはどうすればよいですか?

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 ‘&amp;’ token
List.cpp:23: error: expected constructor, destructor, or type conversion before ‘List’
List.cpp:30: error: expected constructor, destructor, or type conversion before ‘&amp;’ token
List.cpp:35: error: expected constructor, destructor, or type conversion before ‘List’
4

1 に答える 1

3
template <class T>
typename List<T>::const_iterator& List<T>::const_iterator::operator++()

戻り値の型が指定された時点では、 のいわゆるレキシカル スコープ内にはいませんList<T>。そしてconst_iterator、囲んでいるスコープにタイプがないため、エラーが発生します(ただし、その方が少し良くなる可能性がありますが、IMHO)。

C++11 のもう 1 つのオプションは、末尾の戻り値の型です。

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

ただし、クラス自体でこれらをインラインで定義することをお勧めします。クラス外の定義には特別な理由がありますか?

于 2012-02-07T03:19:34.447 に答える