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

时间:2014-10-21 15:11:24

标签: c++ compiler-errors operator-overloading overloading operator-keyword

我试图用复数来重写C ++中的*运算符。我还声明了一个常量I,它位于类文件(Complex.h)中。 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;
}

这是我的Header文件:

#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));
}

1 个答案:

答案 0 :(得分:3)

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

要更正,只需通过

将其声明为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,这是不允许的。