返回类型与返回类型(运算符++)不相同,也不协变
Return type is not identical to nor covariant with return type (operator++)
我有以下错误:
IntelliSense:返回类型与重写的虚拟函数"Counter::operator++"的返回类型"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;
};
受限计数器.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;
};
以及实现
计数器.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;
}
受限计数器.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++'不同并且不是协变的
当我在计数器.h的后增量中删除虚拟时,则完全没有错误。因此,使用预增量,一切都很好。所以我不知道是因为我如何实现后增量?此外,当我覆盖后增量(运算符++(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资格。
有一些不同的方法可以解决类似的问题
-
把所有的东西都放在一个班里。你真的需要2个计数器类,而不是一个可以用计数器策略参数化的计数器类吗(可以从简单的
enum
到一些复杂的类)enum class CountinngStretegy { Unlimited, Limited} class Counter { public: Counter(CountinngStretegy strategy); //... }
-
使
Counter
独立于LimitedCounter
。然后,如果你想对计数器类型进行参数化,请使用模板:template <typename SomeCounter> void do_smth_with_counter(SomeCounter counter);
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 运算符和返回类型是什么意思?
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 如何确定三元运算符的返回类型?
- 如何使模板化运算符推断出正确的返回类型
- 根据运算符推断模板返回类型:结果
- 重写运算符的返回类型=
- 错误:"运算符="不匹配 |结构返回类型
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 条件运算符的返回类型和两阶段查找
- 如何使用内置返回类型重载运算符?
- 分配运算符的返回类型
- 为什么+运算符重载返回类型是类类型而不是整数
- 如何判断"->"运算符最终是否返回类型?
- 重载运算符:常量与非常量返回类型:任何性能差异
- 流运算符重载中的返回类型
- 模板类中运算符*的尾随返回类型
- 返回类型 ?:运算符和 C++ Primer 中的措辞
- 返回类型与返回类型(运算符++)不相同,也不协变