首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回类型与返回类型(operator++)不完全相同,也不相同。

返回类型与返回类型(operator++)不完全相同,也不相同。
EN

Stack Overflow用户
提问于 2015-11-01 19:03:30
回答 2查看 4.2K关注 0票数 3

我有以下错误:

IntelliSense:返回类型与重写的虚拟函数"Counter::operator++“的返回类型”计数器“不完全相同,也不协变量。

以下是我的项目的标题。

comp.h

代码语言:javascript
复制
/* 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

代码语言:javascript
复制
#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

代码语言:javascript
复制
/* 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

代码语言:javascript
复制
#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 ++':重写虚拟函数返回类型不同,与‘计数器::运算符++’不存在协变关系

当我在post-increment of compt.h中删除虚拟时,根本没有错误。所以在pre-increment.上一切都很好所以我不知道是因为我是如何实现post-increment?的此外,当我重写后置增量( operator++(int) )时,这样写是对的吗:

代码语言:javascript
复制
Counter::operator++(0);

谢谢你帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-01 19:13:53

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

代码语言:javascript
复制
virtual Counter Counter::operator++(int)
LimitedCounter LimitedCounter::operator++(int) override

现在,由于方法是virtual,所以在运行时根据要调用它的对象的vtable来选择正确的实现。

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

事实上,如果你有以下情况,将被接受:

代码语言:javascript
复制
virtual Counter* Counter::operator++(int)
LimitedCounter* LimitedCounter::operator++(int) override

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

该标准规定了第10.3(C++11)节中允许并认为是协变的内容:

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

  • 都是指向类的指针,都是对类的lvalue引用,或者都是对类的rvalue引用。
  • 返回类型B::f中的类与返回类型D::f中的类相同,或者是返回类型D::f中类的一个明确和可访问的直接或间接基类。
  • 指针或引用都具有相同的cv限定,返回类型D::f中的类类型与返回类型B::f中的类类型相比具有相同的cv限定条件或更少的cv限定。
票数 5
EN

Stack Overflow用户

发布于 2015-11-01 19:20:53

解决这样的问题有几种不同的方法。

  1. 把所有的东西都放在一节课上。你真的需要2个计数器类,而不是一个可以用计数器策略参数化的类(从简单的enum到一些复杂的类) 枚举类CountinngStretegy {无限,有限}类计数器{ public:计数器(CountinngStretegy策略);//.}
  2. 使Counter独立于LimitedCounter。然后,如果要在计数器类型上进行参数化,请使用模板: 模板空洞do_smth_with_counter(SomeCounter计数器);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33466009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档