为什么 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& 类型的参数,这将允许它这样做。