为什么我会收到“没有匹配的构造函数错误?

Why do I get a "no matching constructor error?

我希望我的代码采用 namemailcar 作为参数类型,我尝试在名为 [=16] 的 class 中这样做=].在 main() 中,我尝试给 class 一个变量 a,稍后我可以在 cout 中调用它。但是,我得到了这个确切的错误:

no matching constructor for initialization of "Person"

我该如何解决这个问题?

h。文件

#pragma once
#include <iostream>
#include "car.h"
#include <string>

class Person{
    private:
        std::string name;
        std::string mail;
        Car* car;

    public: 
        Person(std::string name, std::string mail);
        Person(std::string name, std::string, Car* car);
        void setMail(std::string mail);
        std::string getMail() const;
        std::string getName() const;
        bool hasAvailableFreeSeats();
        friend std::ostream& operator <<(std::ostream& os, const Person& person);
};

cpp 文件:

#include "person.h"


std::string Person:: getMail() const{
    return mail;
}

std:: string Person:: getName() const{
    return name;
}

void Person:: setMail(std::string mail){
    this -> mail = mail;
}

Person:: Person(std::string name, std::string mail) : Person(name, mail, nullptr){};

Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};

bool Person:: hasAvailableFreeSeats(){
    if (car != nullptr){
        return car-> hasFreeSeats();
    }
}

std::ostream& operator <<(std::ostream& os, const Person& person){
    return os << person.name << ": " << person.mail << "\n";
}

主要内容:

#include "person.h"

int main(){
    std::string name{"Ola Normann"};
    std::string mail{"ola.normann@norge.no"};
    std::unique_ptr<Car> car{new Car{5}};
    Person a{name, mail, std::move(car)};
};

首先,您的 3 参数 Person 构造函数中有错字。第二个参数没有分配给它的名称,所以你最终用它自己初始化 mail class 成员,而不是调用者的输入:

Person::Person(std::string name, std::string, Car* car) : name{name}, mail{mail}, car{car}{};
                                            ^ no name here!                ^ member!

应该是这样的:

Person::Person(std::string name, std::string mail, Car* car) : name{name}, mail{mail}, car{car}{};
                                             ^ has a name now!                  ^ parameter!

现在,话虽如此,您的 main() 代码正在将 3 个值传递给 Person 构造函数:

Person a{name, mail, std::move(car)};

你的Personclass只有1个接受3个参数的构造函数:

Person(std::string name, std::string, Car* car);

main() 中,您的 namemail 变量是 std::string 对象,这很好,但是您的 car 变量是 std::unique_ptr<Car> 对象,而不是 Car* 指针。 std::move(car) 将 return 一个 std::unique_ptr<Car>&& 右值引用,Person 不接受,因此编译器错误。 std::unique_ptr 不能隐式转换为原始指针。您将不得不改用其 get() 方法:

Person a{name, mail, car.get()};

这首先违背了使用 std::unique_ptr 的目的。您应该改为更改 Person class 以保存 std::unique_ptr 对象而不是原始指针,例如:

.h

#pragma once

#include <iostream>
#include <string>
#include <memory>
#include "car.h"

class Person{
    private:
        std::string name;
        std::string mail;
        std::unique_ptr<Car> car;

    public: 
        ...
        Person(std::string name, std::string mail);
        Person(std::string name, std::string mail, std::unique_ptr<Car> car);
        ...
};

.cpp

#include "person.h"

...

Person::Person(std::string name, std::string mail) : Person(name, mail, nullptr){};

Person::Person(std::string name, std::string, std::unique_ptr<Car> car) : name{name}, mail{mail}, car{std::move(car)}{};

...

主要

#include "person.h"

int main(){
    std::string name{"Ola Normann"};
    std::string mail{"ola.normann@norge.no"};
    std::unique_ptr<Car> car{new Car{5}};
    Person a{name, mail, std::move(car)};
    // alternatively:
    // Person a{name, mail, std::make_unique<Car>(5)};
};