我正在尝试在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;
}
};
答案 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;
}