繁体   English   中英

返回类型与返回类型(操作符++)不相同或协变

[英]Return type is not identical to nor covariant with return type (operator++)

我有以下错误:
IntelliSense:返回类型与重写虚函数“Counter :: operator ++”的返回类型“Counter”不相同或协变

这是我的项目的标题。
counter.h

/* Header file of Counter Class*/
#pragma once
#include <iostream>
using namespace std;
//Class definition
class Counter {
    friend ostream &operator<<(ostream &out, const Counter &c);
    public:
        Counter(int n0 = 0);
        virtual Counter &operator++();
        virtual Counter operator++(int);
        void reset();
        int getCount() const;

    private:
        int count;
};

LimitedCounter.h

#pragma once
#include "counter.h"

class LimitedCounter : public Counter{
    friend ostream &operator<<(ostream &out, const LimitedCounter &c);
public:
    LimitedCounter(int low, int up);
    void reset();
    LimitedCounter& operator++();
    LimitedCounter operator++(int); // error here
    operator int() { return getCount(); };
    int getCount() const { return Counter::getCount(); };
private:
    int upper;

};

并实施
counter.cpp

/* Implementation of Counter Class*/

#include "counter.h"
#include <iostream>

Counter:: Counter(int n0) {
     count = n0;
}
Counter& Counter::operator++() {
   count++;
   return *this;
}
Counter Counter::operator++(int) {
   Counter old = *this;;
   count++;
   return old;
}
void Counter::reset(){
   count = 0;
}
int Counter::getCount() const{
   return count;
}
ostream &operator<<(ostream & out, const Counter &c) {
     out << "\nCounter value is now " << c.count ;
     return out;
}

LimitedCounter.cpp

#include "LimitedCounter.h"
LimitedCounter::LimitedCounter(int low, int up) : Counter(low), upper(up) {}

LimitedCounter& LimitedCounter::operator++() {
    if (getCount() < upper) {
        Counter::operator++();
    }
    return *this;
}

LimitedCounter LimitedCounter::operator++(int) {
    if (getCount() < upper) {
        LimitedCounter old = *this;
        Counter::operator++(0); // question?
        return old;
    }
    else {
        return *this;
    }
}

void LimitedCounter::reset() {
    Counter::reset();
}

//friend function
ostream &operator<<(ostream &out, const LimitedCounter &c) {
    out << c.getCount() << endl;
    return out;
}

我收到错误:
错误C2555:'LimitedCounter :: operator ++':覆盖虚函数返回类型不同,并且不是'Counter :: operator ++'的协变

当我在counter.h后递增中删除virtual时 ,则根本没有错误。 因此, 预增量一切正常。 所以我不知道是因为我如何实现后增量 而且当我覆盖后增量( operator ++(int) )时,我是这样写的:

Counter::operator++(0);

谢谢你的帮助。

问题很简单:您按值返回对象,因此您有以下情况

virtual Counter Counter::operator++(int)
LimitedCounter LimitedCounter::operator++(int) override

现在,由于该方法是virtual ,因此根据您调用它的对象的vtable在运行时选择正确的实现。

这意味着编译器不能事先知道operator++返回的类型,但是他需要至少知道它的大小,因为它是一个值(而不仅仅是一个指针)。

确实如果您有以下情况将被接受:

virtual Counter* Counter::operator++(int)
LimitedCounter* LimitedCounter::operator++(int) override

因为运行时实现在任何情况下都会返回一个指针,因此编译器能够正确处理它。

该标准规定了§10.3(C ++ 11)中允许和考虑的协变量:

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

  • 两者都是类的指针,都是对类的左值引用,或者两者都是对类的右值引用

  • 在返回类型的类B::f是相同的类中的返回类型的类D::f ,或者是一个明确的和可访问的直接或间接的基类中的返回类型的类的D::f

  • 指针或引用具有相同的cv限定,并且返回类型D :: f中的类类型具有与B :: f的返回类型中的类类型相同的cv-qualification或更少的cv-qualification。

这是解决这类问题的一些不同方法

  1. 把所有的东西放在一个班级里。 你真的需要2个计数器类而不是一个可以用计数器策略进行参数化的计数器(可以从简单的enum到一些复杂的类)

     enum class CountinngStretegy { Unlimited, Limited} class Counter { public: Counter(CountinngStretegy strategy); //... } 
  2. 使Counter独立于LimitedCounter 然后,如果您想在计数器类型上进行参数化,请使用以下模板:

     template <typename SomeCounter> void do_smth_with_counter(SomeCounter counter); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM