:Iが仮想メソッドでイテレータネストされたクラスを含む第一のクラスA有する無効な共変戻り型、ネストされたクラスC++
template <typename T >
class A {
public:
class iterator {
public:
virtual ~iterator() {};
virtual T& operator++();
};
virtual iterator begin() const = 0;
};
私は2番目のクラスBを持って、そのオーバーライドvirtualsを方法:
template <typename T >
class B : public A<T> {
public:
class iterator : A<T>::iterator {
T& operator++() override {
iterator p(*this);
return p; //for exemple
}
};
iterator begin() const override {
return iterator(this);// for exemple
}
};
しかし、私はBクラスを使用する場合:
B<int> test;
を、私はこのような何かを持っている、コンパイルエラー:
error: invalid covariant return type for 'B<T>::iterator B<T>::begin() const [with T = int]'
error: overriding 'B<T>::iterator V<T>::begin() const [with T = int]'
Bクラスのイテレータを実装する方法は?
テクニカルストーリーテラーの話は、(このように呼ばれていた)値型多型と呼ばれ、あなたはこの回答に興味深いリンクを見つけるでしょう:https://stackoverflow.com/questions/38010081/polymorphism-inheritance-and-value-タイプ – Oliv
仮想メソッドは、ポインタと参照でのみ機能します。したがって、イテレータを値で返すことで、それを計画している多態的な動作は無効になります(値による共変な戻りは許されます)。 –