错误:传递' xxx'作为'这个' &x; xxx'的论点丢弃限定符[-fpermissive]

时间:2017-11-29 22:48:48

标签: c++

我正在编写一个介绍c ++课程的程序,并且我收到了一条我不理解的错误消息。我有一个名为fraction的类,有一个名为DividedBy的成员函数。 DividedBy被初始化并定义如下:

fraction fraction::DividedBy(fraction operand)      

fraction fraction::DividedBy(fraction operand){
int quotNum = num * operand.num;
int quotDenom = denom * operand.denom;

simplify(quotNum, quotDenom);

fraction quot = fraction(quotNum, quotDenom);
return quot;}

我正在调用DividedBy这个函数:

result = f3.DividedBy(f4);

结果,f3和f4都是分数对象。我收到此错误消息:

传递' const fraction'作为'这个' '分数分数的参数:: DividedBy(分数)'抛弃限定符[-fpermissive]

这是什么意思?我已经查到了这条消息,似乎总是让某人试图传递一个不断的争论,我很确定我不会在这里做。我以某种方式丢弃了什么限定符?

2 个答案:

答案 0 :(得分:2)

这意味着您已将f3声明为const fraction类型,这意味着您无法更改它。即使方法DividedBy没有改变它,也不能保证它,所以编译器假设方法可以以某种方式改变它。

这里的解决方案要么不使f3保持不变,要么通过将声明和定义更改为

来使方法DividedBy保持不变
fraction fraction::DividedBy(fraction operand) const   

fraction fraction::DividedBy(fraction operand) const {
...
}

根据经验,最好使任何可以保持不变的常数。例如,您可以创建类型const fraction &的操作数,这样可以防止对类进行不必要的复制,同时在传递常量分数时仍然不会阻止代码编译。

最后一部分[-fpermissive]只是编译器告诉你如何抑制这个警告并让它继续编译(你只需将这个标志传递给编译器)。很高兴知道有这个选项,但你永远不应该使用它,除非你真的确定你在做什么以及为什么它不能以正确的方式完成。

答案 1 :(得分:1)

f3是一个const引用,如果是这样,DevidedBy必须声明为const。