无效的协变返回类型,嵌套类c
作者:互联网
我有一个第一个类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类中实现迭代器?
解决方法:
根据[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:
- 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[…]
您的公开内容不会继承,因此无法访问该基础.而且你没有返回指针或引用.
返回具有值语义的类型是好的!你不应该放弃这一点.您可以使用pimpl习语替换co-variant返回类型的尝试.让迭代器通过指针管理多态“迭代器实现”类.
标签:c,virtual,covariance,covariant-return-types 来源: https://codeday.me/bug/20190823/1698160.html