C++ 错误:在';之前需要构造函数、析构函数或类型转换';代币

C++ 错误:在';之前需要构造函数、析构函数或类型转换';代币,c++,debugging,operator-overloading,C++,Debugging,Operator Overloading,我不断地犯这个错误,我不知道如何克服它。我是一个初学者,正在尝试构建一个代码来练习操作符重载。首先,我有一个错误,说对FeetInches有一个未识别的引用(unsigned int=0,int=0)。然后我试着实现构造函数,结果却出现了那个错误 #include<iostream> #include<cstdlib> using namespace std; class FeetInches { private: unsigned int feet; in

我不断地犯这个错误,我不知道如何克服它。我是一个初学者,正在尝试构建一个代码来练习操作符重载。首先,我有一个错误,说对FeetInches有一个未识别的引用(unsigned int=0,int=0)。然后我试着实现构造函数,结果却出现了那个错误

 #include<iostream>
#include<cstdlib>
using namespace std;
class FeetInches
{
private:
   unsigned int feet;
   int inches;
   void simplify();
public:
   FeetInches(unsigned int= 0, int= 0);
   FeetInches operator+(const FeetInches &);
   void display();
};

void FeetInches::simplify()
{
if (inches >=12)
   {
      feet+= (inches/12);
      inches = inches % 12;
   }// end of IF
else if (inches <0)
 {
  feet-=((abs(inches)/12)+1);
  inches = 12-(abs(inches)%12);
  }// end of elseif
}// end of simplify

FeetInches FeetInches::operator+(const FeetInches & right)
{
   FeetInches one (10,15);
   FeetInches ruler(5,3);
   FeetInches temp;
   temp=one+ruler;// temp one.operator +(ruler)
   temp.display();
}
 FeetInches::FeetInches(feet =0,inches=0)
 {

 }

void FeetInches::display()
{
    cout << "F: " << feet <<  " I:" <<  inches << endl;
}

int main()
{
   FeetInches aMeasure;
   aMeasure.display();


   return 0;
};
#包括
#包括
使用名称空间std;
课堂气氛
{
私人:
无符号整数英尺;
整数英寸;
无效简化();
公众:
FeetInches(无符号int=0,int=0);
FeetInches运算符+(const FeetInches&);
void display();
};
void FeetInches::simplify()
{
如果(英寸>=12)
{
英尺+=(英寸/12);
英寸=英寸%12;
}//IF结束
else if(inches语法应为

FeetInches(unsigned int feet = 0, int inches = 0);
为了声明,而不是

FeetInches::FeetInches(unsigned int feet, int inches)
    : feet(feet), inches(inches)
{ }
在定义中

原因是技术上的,不是逻辑上的,它们取决于C++如何在较低的层次上实现。

参数的默认值是由函数的“强>调用方< /强>提供的,因此它们必须在函数的<强>声明< /强>中指定,因为在C++中,编译器编译时调用它时,不能保证函数的实现。

这很明显,你没有。将构造函数主体附加到代码中,为此,您可以编写以下代码:

class type_name{
   public : 
      type_name (...ARGS...){ ... }
}; 
还是这个

class type_name{
   public :
      type_name (...ARGS...);
};
type_name(... ARGS ...){ ...body.. }
因此,您需要附加正文,否则链接器将无法生成二进制文件,这就是它背后发生的事情:

1-然后调用编译器为您编写的每个{.c/.cpp/.cxx…}生成一个.obj文件。
2-然后调用链接器来创建最终输出,为此他需要在任何.obj文件中找到每个被调用函数的引用。如果您只编写函数声明,而您不调用它,链接器可能只会发出警告,但如果您调用它,他需要找到它的代码。因为他需要用代码addre替换调用如果没有代码,他会给你一个不确定的引用错误

对于每个函数代码,都有一个标头,告诉您要传递给此代码的arrguments nember类型。他告诉您如何查找函数体。您在声明中写道“FeetInches(unsigned int=0,int=0);”这就是头,您稍后使用这些参数调用了函数,然后链接器需要找到对应于该头的代码,但他没有找到,因为在实现中您没有附加类型 (事实上不止这些,但这正是你现在需要知道的,链接器添加了一些额外的参数…) 在这里您可以找到有关此主题的更多信息

注意:只将默认值放在声明中(类内),不要在声明外重复,事实上,现代编译器不会接受您编写的内容并指定错误(至少在命令行中使用默认复制参数时是这样),并在将主体放在类外部时添加参数类型,以确保编译器能够找到它