没有匹配的函数可供调用,但从未调用过那个精确的函数

No matching function for call, but never called that exact function

本文关键字:函数 调用      更新时间:2023-10-16

我一直收到这样的错误:对‘Dog::Dog()的调用没有匹配的函数

它说我给出了0个参数,但没有相应的函数。但事实上,我提供了一个论点,就像我打算做的那样,错误仍然存在。

我做了一个临时修复,创建了一个不带参数的构造函数,只将dogs名称初始化为"

我的狗狗类

class Dog{
    string name;
public:
    Dog( string vName );
    string getName() { return name; }
};

初始化狗的所有东西

  • 人类类

class Human{
    Dog myDog;
    string name;
    int age;
public:

  • 人工构建器

           •;默认构造函数

Human::Human(){
    name = "undefined";
    age = 0;
    myDog = Dog("Jimmy");
}

           •;超载建造商1

Human::Human(string vName, int vAge){
    name = vName;
    age = vAge;
    myDog = Dog("Jimmy");
}

           •;超载建造商2

Human::Human(string vName, int vAge, Dog vDog){
   age = vAge;
   name = vName;
   myDog = vDog;
}

正如您所看到的,没有任何东西只使用dog()初始化狗。一切都用一个字符串作为参数1来初始化dog。

Human的构造函数中,您试图用不存在的默认构造函数初始化Dog对象。发生这种情况是因为当您到达构造函数主体时,所有成员变量都应该已经构造好了。如果不使用初始化列表,则选择的构造函数是默认的构造函数(Dog类不存在该构造函数)。

您可以使用如下初始化列表来修复此问题:

Human::Human()
    : name("undefined")
    , age(0)
    , myDog("Jimmy")
    {}
Human::Human(string vName, int vAge)
    : name(vName)
    , age(vAge)
    , myDog("Jimmy")
    {}
Human::Human(string vName, int vAge, Dog vDog)
    : name(vName)
    , age(vAge)
    , myDog(vDog)
    {}

Human类中,此行:

Dog myDog;

您确实使用默认构造函数创建了一个dog,所以它就是从那里调用的。

Human构造函数中,您确实设置了myDog:

myDog = Dog("Jimmy");

这将扩展为两个步骤:

  • 通过调用Dog(string)构造函数创建一个新的临时Dog对象
  • 调用Dog的赋值运算符,将临时对象赋值给Human类中包含的对象

您可能想做的是从Human构造函数中为myDog字段调用一个特定的构造函数:

Human::Human(): myDog("Jimmy") {
    name = "undefined";
    age = 0;
}

在类的定义中

class Human{
    Dog myDog;
    string name;
    int age;
public:

为了创建对象myDog,将调用类Dog的默认构造函数。但是,您没有在此类中定义默认构造函数。因此编译器会发出错误。

在C++中,类的实例变量是在调用类的构造函数之前构造的。这是通过调用类的默认构造函数来完成的。这就是初始化的来源。

这可以通过在Human构造函数中使用初始值设定项列表语法来修复:

Human::Human() : myDog("Jimmy") {  
    name = "undefined";
    age = 0;
}