为什么 g++ 似乎混淆了数据类型?
Why does it seem that g++ is mixing up data types?
我目前正在为我的大学作业制作一个大型整数库。
我在使用以下代码时遇到问题:
MyInteger::MyInteger(){ //default
//some code
}
MyInteger::MyInteger(char *s){ //construct from string
//some code
}
MyInteger::MyInteger(MyInteger &otherInt){ //copy constructor
//some code
}
MyInteger MyInteger::parse(char *s){ //parse string and create new object
return MyInteger(s);
}
我收到有关解析函数的以下错误:
MyInteger.cpp: In static member function ‘static MyInteger MyInteger::parse(char*)’:
MyInteger.cpp:34:20: error: no matching function for call to ‘MyInteger::MyInteger(MyInteger)’
return MyInteger(s);
^
MyInteger.cpp:34:20: note: candidates are:
MyInteger.cpp:23:1: note: MyInteger::MyInteger(MyInteger&)
MyInteger::MyInteger(MyInteger &otherInt){ //copy constructor
^
MyInteger.cpp:23:1: note: no known conversion for argument 1 from ‘MyInteger’ to ‘MyInteger&’
MyInteger.cpp:10:1: note: MyInteger::MyInteger(char*)
MyInteger::MyInteger(char *s){ //construct from string
^
MyInteger.cpp:10:1: note: no known conversion for argument 1 from ‘MyInteger’ to ‘char*’
MyInteger.cpp:4:1: note: MyInteger::MyInteger()
MyInteger::MyInteger(){ //set string to 0
^
MyInteger.cpp:4:1: note: candidate expects 0 arguments, 1 provided
不应该使用第二个构造函数吗?
它要么将字符串与 MyInteger 混淆,要么字符串以某种方式被转换为 MyInteger,然后编译器尝试使用它列出的 3 个候选者再次转换它。重载的 + 运算符也会出现类似的错误。
请告诉我哪里做错了。
问题不在于 MyInteger(s)
。它构造那个临时对象。问题在于尝试 return 这个临时对象。您正在按值 returning,这意味着需要制作副本,但您的复制构造函数采用 MyInteger&
,它无法绑定到临时对象(右值)。您的复制构造函数应该具有 const MyInteger&
类型的参数,这将允许它这样做。
我目前正在为我的大学作业制作一个大型整数库。 我在使用以下代码时遇到问题:
MyInteger::MyInteger(){ //default
//some code
}
MyInteger::MyInteger(char *s){ //construct from string
//some code
}
MyInteger::MyInteger(MyInteger &otherInt){ //copy constructor
//some code
}
MyInteger MyInteger::parse(char *s){ //parse string and create new object
return MyInteger(s);
}
我收到有关解析函数的以下错误:
MyInteger.cpp: In static member function ‘static MyInteger MyInteger::parse(char*)’:
MyInteger.cpp:34:20: error: no matching function for call to ‘MyInteger::MyInteger(MyInteger)’
return MyInteger(s);
^
MyInteger.cpp:34:20: note: candidates are:
MyInteger.cpp:23:1: note: MyInteger::MyInteger(MyInteger&)
MyInteger::MyInteger(MyInteger &otherInt){ //copy constructor
^
MyInteger.cpp:23:1: note: no known conversion for argument 1 from ‘MyInteger’ to ‘MyInteger&’
MyInteger.cpp:10:1: note: MyInteger::MyInteger(char*)
MyInteger::MyInteger(char *s){ //construct from string
^
MyInteger.cpp:10:1: note: no known conversion for argument 1 from ‘MyInteger’ to ‘char*’
MyInteger.cpp:4:1: note: MyInteger::MyInteger()
MyInteger::MyInteger(){ //set string to 0
^
MyInteger.cpp:4:1: note: candidate expects 0 arguments, 1 provided
不应该使用第二个构造函数吗? 它要么将字符串与 MyInteger 混淆,要么字符串以某种方式被转换为 MyInteger,然后编译器尝试使用它列出的 3 个候选者再次转换它。重载的 + 运算符也会出现类似的错误。
请告诉我哪里做错了。
问题不在于 MyInteger(s)
。它构造那个临时对象。问题在于尝试 return 这个临时对象。您正在按值 returning,这意味着需要制作副本,但您的复制构造函数采用 MyInteger&
,它无法绑定到临时对象(右值)。您的复制构造函数应该具有 const MyInteger&
类型的参数,这将允许它这样做。