我有一个第一个类A,它包含一个带有虚方法的迭代器嵌套类:
template <typename T >
class A {
public:
class iterator {
public:
virtual ~iterator() {};
virtual T& operator++();
};
virtual iterator begin() const = 0;
};
我有第二个B类,它覆盖虚拟方法:
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类中实现迭代器?
答案 0 :(得分:6)
根据[class.virtual]/8,共变量返回类型需要满足一些约束。
覆盖函数的返回类型应与...相同 被重写函数的返回类型或与变量的协变 功能的类。如果函数D :: f覆盖函数 B :: f,如果它们是函数的返回类型是协变的 满足以下标准:
- 都是指向类的指针,都是对类的左值引用,或者两者都是对类的右值引用
B :: f的返回类型中的类与D :: f的返回类型中的类是同一个类,或者是明确的 返回中类的可访问直接或间接基类 类型D :: f
[...]
您的公开内容不会继承,因此无法访问该基础。而且你没有返回指针或引用。
返回具有值语义的类型是好的!你不应该放弃这一点。您可以使用pimpl习语替换co-variant返回类型的尝试。让iterator
通过指针管理多态“迭代器实现”类。