C++ 赋值运算符不起作用
我有一个构造函数来表示大数字并将它们存储到向量中: 我的类由一个向量、一个布尔值和一个整数组成,应该表示大的数字C++ 赋值运算符不起作用,c++,constructor,overloading,operator-keyword,C++,Constructor,Overloading,Operator Keyword,我有一个构造函数来表示大数字并将它们存储到向量中: 我的类由一个向量、一个布尔值和一个整数组成,应该表示大的数字 CBigInt(const char* str2) { string str=string(str2); num.resize(200000); if (str[0]=='-') { signe=true; pos=str.length()-1; for (int i=pos;i>0;i
CBigInt(const char* str2)
{
string str=string(str2);
num.resize(200000);
if (str[0]=='-')
{
signe=true;
pos=str.length()-1;
for (int i=pos;i>0;i--)
{
num[pos-i]=str[i]-48;
}
}
else
{
signe=false;
pos=str.length();
for (int i=pos;i>=0;i--)
{
num[pos-i-1]=str[i]-48;
}
}
}
我得到一个错误:一个转换序列最多只能包含一个隐式的用户定义转换。您的包含两个:
const char[]
到string
,然后string
到cborigint
一个简单的解决方法是使一个转换显式:
CBigInt autre("123456789012345678901111");
转换序列最多只能包含一个隐式用户定义转换。您的包含两个:
const char[]
到string
,然后string
到cborigint
一个简单的解决方法是使一个转换显式:
CBigInt autre("123456789012345678901111");
在现有构造函数的基础上声明并实现一个附加构造函数:
CBigInt::CBigInt(const char* str):CBigInt(string(str)){}
在现有构造函数的基础上声明并实现一个附加构造函数:
CBigInt::CBigInt(const char* str):CBigInt(string(str)){}
很可能它们不起作用,因为编译没有在同一个操作中提供两个隐式转换,一个从
Const Char*
到String
,另一个从String
到cborigint
。并且只有当类型为cborigint
时,才可能调用operator=
这可以在与类一起正确编译的代码中重新编写:
CBigInt a("99") //justo one implicit convertion, to const char * to string
string std;
a = std; //just one implicit convertion, to String to CBigInt
a = string("99"); //just one implicit convertion, to String to CBigInt
我的建议是将您的代码从CBigInt(string)
复制到CBigInt(const char*)
,并在字符串末尾搜索“\0”
我给你的另一个建议是将签名从
CBigInt(string)
交换到CBigInt(const string&)
,速度更快,因为不复制字符串,也不需要更改代码。很可能它们不起作用,因为编译在同一操作中不提供两个隐式转换,一个从Const Char*
到String
,一个从String
到cborigint
。并且只有当类型为cborigint
时,才可能调用operator=
这可以在与类一起正确编译的代码中重新编写:
CBigInt a("99") //justo one implicit convertion, to const char * to string
string std;
a = std; //just one implicit convertion, to String to CBigInt
a = string("99"); //just one implicit convertion, to String to CBigInt
我的建议是将您的代码从CBigInt(string)
复制到CBigInt(const char*)
,并在字符串末尾搜索“\0”
我给你的另一个建议是将你的签名从
CBigInt(string)
交换到CBigInt(const string&)
,速度更快,因为它不复制字符串,也不需要更改代码。字符串是std::string
?是的字符串是std::string。你可以这样做CBigInt foo=std::string(“11113”)
但是我仍然想知道为什么它不能从const char[]隐式构造字符串
顺便说一句,如果你支持c++11,你可能需要定义一个用户定义的文本。这远没有那么令人困惑<代码>'0'
。字符串是std::string
?是的字符串是std::string。你可以这样做cborigint foo=std::string(“11113”)
,但我仍然想知道为什么它不能从const char[]隐式构造字符串,如果您有c++11支持,您可能需要定义一个用户定义的文本。提示:避免使用幻数,而是使用字符文本。这远没有那么令人困惑<代码>'0'
。但这不会使两个构造函数混淆吗?@stepanBY:1。你应该更新你的问题,而不是改变它,因为现在没有以前给出的答案似乎相关。2.对于当前的问题,您需要提供实际导致运行时错误的代码(而不仅仅是CBigInt
类)。但这不会混淆两个构造函数吗?@stepanBY:1。你应该更新你的问题,而不是改变它,因为现在没有以前给出的答案似乎相关。2.对于当前的问题,您需要提供实际导致运行时错误的代码(而不仅仅是cborigint
类)。或者直接使用const char*可能更好?或者直接使用const char*可能更好?但在这之后,我是否必须调整所有重载的运算符?通过用const*char替换const string?但是在那之后,我是否需要调整所有重载的运算符?用常量*字符替换常量字符串?