没有匹配的函数可供调用,但从未调用过那个精确的函数
No matching function for call, but never called that exact function
我一直收到这样的错误:对‘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;
}
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销