4

List::find() というメソッドのテンプレート クラスの横にネストされたテンプレートがあります。このメソッドは、「関数条件」である入力としてファンクターを取得します。

template<class T>
class List {
....
template<class Function>
Iterator find(Function condition) const;
....
};

template<class T, class Function>
typename List<T>::Iterator List<T>::find(Function condition) const {
   List<int>::Iterator it = this->begin();
   for (; it != this->end(); ++it) {
   if (condition(*it)) {
       break;
   }
   }
   return it;
}

エラーは次のとおりです。

..\list.h:108:62: error: invalid use of incomplete type 'class List<T>'
..\list.h:16:7: error: declaration of 'class List<T>'

リストはどのように参照すればよいですか? 宣言が正しくないのはなぜですか?

編集:

に変更した後:

template<class T>
template<class Function>

次のエラーが表示されます。

..\list.h:111:30: error: no match for 'operator++' in '++it'
..\list.h:112:18: error: no match for 'operator*' in '*it'

この演算子宣言を参照するもの (そのうちの 1 つ):

template<class T>
typename List<T>::Iterator& List<T>::Iterator::operator++() {
    List<T>::ConstIterator::operator++();
    return *this;
}

この演算子の宣言が、find() の実装ごとに異なる必要があるのはなぜですか?

4

1 に答える 1

5

いいえ

template<class T, class Function>
typename List<T>::Iterator List<T>::find(Function condition) const {
   ...
}

むしろ

template<class T>
template<class Function>
typename List<T>::Iterator List<T>::find(Function condition) const {
   ...
}

2 つを「分離」する必要がありますtemplate<...>(1 つ目はクラス用、2 つ目はメンバー関数用)。

于 2013-06-14T09:17:18.590 に答える