错误:将"const Complex"作为'....'丢弃限定符的"this"参数传递

error: passing ‘const Complex’ as ‘this’ argument of '....' discards qualifiers

本文关键字:参数传递 this 作为 Complex 错误 const      更新时间:2023-10-16

我正试图用复数重载C++中的*运算符。我还在类文件(Complex.h)中声明了一个常量I。Complex.cpp是该类的实现。主文件用于测试。但是,它无法编译。如何修复?

error: passing ‘const Complex’ as ‘this’ argument of ‘Complex Complex::operator*(const Complex&)’ discards qualifiers [-fpermissive]
 cout << "Actual:" << (I * I) << endl;

这是我的主文件:

#include <iostream>
#include "Complex.cpp"  //remove it 
#include "Complex.h"
using namespace std;
int main (){
    // test multiplication
    cout << "nExpected:I*I = -1" << endl;
    cout << "Actual:" << (I * I) << endl;
    return 0;
}

这是我的头文件:

#ifndef COMPLEX_H
#define COMPLEX_H
#include <cstdlib> //exit
#include <iostream>
class Complex{
    public:
    Complex(double a, double b);
    Complex(double a);
    double real() const{ 
        return a;
    }
    double imag() const{
        return b;
    }
    Complex operator*(const Complex& c2);
    private:
    double a;
    double b;
};
//define a constant i
const Complex I(0,1);
#endif

这是实现文件:

#include "Complex.h"
#include <cmath>
using namespace std;
Complex::Complex(double realNum, double imagNum):a(realNum),b(imagNum){}
Complex::Complex(double realNum):a(realNum),b(0){}
Complex Complex::operator*(const Complex& c2){
    double c = c2.real(), d = c2.imag();
    return Complex((a*c-b*d),(b*c+a*d));
}

您的语句(I * I)乘以两个const Complex,因此您只能使用该类的const方法。但是,您的operator*仅在非常量版本中可用。

要更正,只需通过将其声明为const

Complex operator*(const Complex& c2) const;

在实现中也是如此。


编辑:更详细地说:你基本上有两种可能性来声明一个二进制运算符,要么在类外声明为

Complex operator*(Complex const& a, Complex const& b);

或通过在其内部

Complex operator*(Complex const& a) const;

您选择了课内版本。因此,当编译器看到(I*I),其中两者都是const时,它将表达式转换为I.operator*(I)。然而,为了做到这一点,operator*也必须是const,否则它不能从常数I调用。这是因为编译器必须假设该方法将更改I,这是不允许的。