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

Ale*_*ert 3 c++ virtual covariance covariant-return-types

我有一个第一个类A,它包含一个带有虚方法的迭代器嵌套类:

template <typename T >
class A {
  public:
      class iterator {
      public:
          virtual ~iterator() {};
          virtual T& operator++();
       };

      virtual iterator begin() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

我有第二个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 
   } 
};
Run Code Online (Sandbox Code Playgroud)

但是当我使用B类时:

B<int> test;
Run Code Online (Sandbox Code Playgroud)

我有这样的东西,编译错误:

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]'
Run Code Online (Sandbox Code Playgroud)

如何在B类中实现迭代器?

Sto*_*ica 6

根据[class.virtual]/8,共变量返回类型需要满足一些约束.

重写函数的返回类型应与重写函数的返回类型相同或与函数类的协变相同.如果函数D :: f覆盖函数B :: f,则函数的返回类型如果满足以下条件则是协变的:

  • 两者都是类的指针,都是对类的左值引用,或者两者都是对类的右值引用
  • 返回类型为B :: f的类与返回类型为D :: f的类相同,或者是返回类型中类的明确且可访问的直接或间接基类D :: f

  • [...]

您的公开内容不会继承,因此无法访问该基础.而且你没有返回指针或引用.

返回具有值语义的类型是好的!你不应该放弃这一点.您可以使用pimpl习语替换co-variant返回类型的尝试.已经iterator通过指针管理一个多态"迭代实现"类.