[英]invalid covariant return type, nested class c++
I have a first class A that contain an iterator nested class with virtual methods: 我有一个第一个类A,它包含一个带有虚方法的迭代器嵌套类:
template <typename T >
class A {
public:
class iterator {
public:
virtual ~iterator() {};
virtual T& operator++();
};
virtual iterator begin() const = 0;
};
I have a second class B, that override virtuals methods: 我有第二个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
}
};
But when i use B class : 但是当我使用B类时:
B<int> test;
I have something like this, compilation error: 我有这样的东西,编译错误:
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]'
How to implements iterator in B class ? 如何在B类中实现迭代器?
Co-variant return types have a couple of constraints they need to satisfy according to [class.virtual]/8 . 根据[class.virtual] / 8,共变量返回类型有一些它们需要满足的约束。
The return type of an overriding function shall be either identical to the return type of the overridden function or covariant with the classes of the functions.
重写函数的返回类型应与重写函数的返回类型相同,或者与函数类的协变相同。 If a function D::f overrides a function B::f, the return types of the functions are covariant if they satisfy the following criteria:
如果函数D :: f覆盖函数B :: f,则函数的返回类型如果满足以下条件则是协变的:
- both are pointers to classes, both are lvalue references to classes, or both are rvalue references to classes
两者都是类的指针,都是对类的左值引用,或者两者都是对类的右值引用
the class in the return type of B::f is the same class as the class in the return type of D::f, or is an unambiguous and accessible direct or indirect base class of the class in the return type of D::f
返回类型为B :: f的类与返回类型为D :: f的类相同,或者是返回类型中类的明确且可访问的直接或间接基类D :: f
[...]
[...]
Yours doesn't inherit publicly, so the base isn't accessible. 您的公开内容不会继承,因此无法访问该基础。 And you aren't returning a pointer or a reference.
而且你没有返回指针或引用。
Returning a type with value semantics is good! 返回具有值语义的类型是好的! You should not give up on that.
你不应该放弃这一点。 You can substitute the attempt at a co-variant return type with the pimpl idiom.
您可以使用pimpl习语替换co-variant返回类型的尝试。 Have
iterator
manage a polymorphic "iterator implementation" class via pointer. 让
iterator
器通过指针管理多态“迭代器实现”类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.