【问题标题】:Error: passing 'const xxx' as 'this' argument discards qualifiers错误:将“const xxx”作为“this”参数传递会丢弃限定符
【发布时间】:2019-08-18 20:13:43
【问题描述】:

我正在尝试用 c++ 实现 bigint 类,它还没有完成,我遇到了一些我无法理解的错误。

我已经删除了所有其他功能(因为在这种情况下它们是不必要的) 并且 karatsuba 尚未完成(但在这种情况下应该不会造成问题)。

在乘法函数(重载 * )中,我的编译器给出了一个错误:

将 'const BigInt' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]

一行

 ans.a = karatsuba(n,m);

我知道当我尝试更改常量对象或传递给常量函数的对象时会发生这种情况,在我的情况下,我只是创建一个新向量并将其传递给 karatsuba 函数。 从 overloded * 中删除 const 可以消除此错误。

那么,这是否意味着常量函数根本不能改变任何东西? (包括局部变量?)

class BigInt {

    typedef long long int ll;
    typedef vector<int> vi;
    #define p10 1000000000;
    #define range 9
    vi a;
    bool sign;
    public:

    BigInt operator * (const BigInt &num) const
    {
        vi n(a.begin(),a.end()),m(num.a.begin(),num.a.end());
        BigInt ans;
        ans.sign = !(sign ^ num.sign);
        while(n.size()<m.size()) n.push_back(0);
        while(n.size()>m.size()) m.push_back(0);
        ans.a = karatsuba(n,m);
        return ans;
    }

    vi karatsuba(vi a,vi b)
    {
        int n = a.size();
        if(n <= 16)
        {  
             // some code
        }
             // some code
        return a;
    }
};

【问题讨论】:

    标签: class object compiler-errors constants


    【解决方案1】:

    好的,所以在谷歌搜索后,我意识到这个指针被隐式传递给 oveloaded * 然后传递给 karatsuba(因为它是类的成员函数),并且由于 karatsuba 不是一个常量函数,所以不能保证它不会更改对象内容,因此会触发此错误。 一种解决方案是将 karatsuba 声明为静态的,因为静态成员函数不接收此指针(它们甚至可以在没有类对象的情况下仅使用 :: 运算符来调用),从这里阅读更多关于它们的信息 Static data members and member functions.

    所有需要改变的是:-

    static vi karatsuba(vi a,vi b)
    {
        int n = a.size();
        if(n <= 16)
        {  
             // some code
        }
             // some code
        return a;
    }
    

    【讨论】:

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