其他分享
首页 > 其他分享> > 无效的协变返回类型,嵌套类c

无效的协变返回类型,嵌套类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