ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-23 15:11:45  阅读:188  来源: 互联网

标签: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;
};

我有第二个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有