错误:将'xxx'作为'xxx'丢弃限定符的参数传递'this' [-允许]

error: passing 'xxx' as 'this' argument of 'xxx' discards qualifiers [-fpermissive]

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

我正在编写一个介绍性C 类的程序,并且我收到的错误消息我不了解。我有一个称为分数的类,带有一个名为Divideby的成员函数。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;}

我称之为划分的函数:

result = f3.DividedBy(f4);

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

将" const ration"作为"分数分数::分裂(分数)"的" const ration"丢弃了预选赛[-fpermissive]

这是什么意思?我查看了此消息,似乎总是涉及一个试图通过不断的论点的人,我敢肯定我在这里不做。我以某种方式丢弃的预选赛是什么?

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

这里的解决方案要么通过将声明和定义更改为

来使F3恒定或更好地使方法DividedBy恒定
fraction fraction::DividedBy(fraction operand) const   
fraction fraction::DividedBy(fraction operand) const {
...
}

根据经验法则,最好使任何可能恒定的东西保持不变。例如,您可以制作const fraction &类型的操作数,该操作数将阻止您的类不必要地复制您的类,同时仍不阻止代码通过时持续分数。

最后一部分[-fpermissive]只是编译器,告诉您如何抑制此警告并使其对此进行编译(您只需将此标志传递给编译器)。很高兴知道有此选项,但是除非您真的确定自己在做什么以及为什么不能以适当的方式完成它,否则您永远不要使用它。

是f3 a const引用,如果必须将其声明为const。