无效的协变返回类型,嵌套类C

invalid covariant return type, nested class c++

本文关键字:嵌套 返回类型 无效      更新时间:2023-10-16

我有一个一级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。

覆盖功能的返回类型应与 覆盖功能的返回类型或与 功能类。如果功能D :: F覆盖功能 b :: f,如果函数的返回类型是协变量的 满足以下标准:

  • 两者都是类的指针,两者都是对类的lvalue引用,或者两者都是对类的rvalue参考
  • b :: f的返回类型中的类与d :: f的返回类型中的类是同一类,或者是明确的 返回中的类的可访问的直接或间接基类 D :: f

  • 的类型
  • [...]

您的不公开继承,因此无法访问基础。而且您没有返回指针或参考。

返回具有价值语义的类型很好!你不应该放弃这一点。您可以用Pimpl Idiom替换尝试共同返回类型的尝试。让iterator通过指针管理多态性的"迭代实现"类。