【问题标题】:error: passing 'xxx' as 'this' argument of 'xxx' discards qualifiers [-fpermissive]错误:将 'xxx' 作为 'xxx' 的 'this' 参数传递会丢弃限定符 [-fpermissive]
【发布时间】:2017-11-29 22:48:48
【问题描述】:

我正在为介绍性 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);

result、f3 和 f4 都是分数对象。我收到此错误消息:

将 'const fraction' 作为 'fraction fraction::DividedBy(fraction)' 的 'this' 参数传递会丢弃限定符 [-fpermissive]

这是什么意思?我查看了这条消息,它似乎总是涉及有人试图传递一个不变的论点,我很确定我不会在这里做。我以某种方式丢弃了哪些限定词?

【问题讨论】:

  • 那么f3是如何声明的?
  • 我要大胆的说DividedBy 应该是const,这样你就可以在const fractions 上调用它。
  • 我知道我的错误在哪里。我得到了代码,并被告知要为它编写一个类。代码在我没有意识到的情况下将 f3 声明为常量。我也会尽量确保在未来提供更完整的代码图片。

标签: c++


【解决方案1】:

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

这里的解决方案是不使用 f3 常量,或者通过将声明和定义更改为更好地使方法 DividedBy 成为常​​量

fraction fraction::DividedBy(fraction operand) const   

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

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

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

【讨论】:

    【解决方案2】:

    f3 是 const 引用吗,如果是,DevidedBy 必须声明为 const。

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多