错误:将“ const xxx”作为“ this”参数传递会舍弃限定符

时间:2019-08-18 20:13:43

标签: class object compiler-errors const

我正在尝试在C ++中实现bigint类,但尚未完成,遇到了一些我无法理解的错误。

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

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

  

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

在线

 ans.a = karatsuba(n,m);

我知道,当我尝试更改常量对象或传递给常量函数的对象时,会发生这种情况,在我的情况下,我只是创建一个新矢量并将其传递给karatsuba函数。 从重叠的*中删除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;
    }
};

1 个答案:

答案 0 :(得分:0)

好吧,在进一步搜索之后,我意识到此指针隐式传递给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;
}
相关问题