C ++继承“没有可行的转换”错误

时间:2019-02-17 09:37:59

标签: c++ inheritance derived

有人可以让我知道我在做什么错吗?我正在我的主要对象,并试图将字符串变量传递给它的设置器。我不断收到相同的错误“没有可行的转换”

#define PatientType_hpp
#include "PersonType.hpp"
#include "DoctorType.hpp"
#include "dataType.hpp"

class PatientType : public PersonType
{

private:
  DoctorType drName;

public:
  DoctorType getDrName() const;

  void setDrName(DoctorType);
};

#endif /* PatientType_hpp */

//setters and getters

DoctorType PatientType::getDrName() const { 
  return drName;
}

void PatientType::setDrName(DoctorType drName) {
  this->drName = drName;
}

#ifndef DoctorType_hpp
#define DoctorType_hpp
#include "PersonType.hpp"
#include <stdio.h>
    class DoctorType: public PersonType
{
private:

    string drSpecialty;


public:

        string getDrSpecialty()const;
        void setDRSpecialty(string);

};
#endif /* DoctorType_hpp */

#include "DoctorType.hpp"
#include <iostream>

    string DoctorType::getDrSpecialty()const
{
        return drSpecialty;

}
    void DoctorType::setDRSpecialty(string drSpecialty)
{
        this->drSpecialty=drSpecialty;

}

int main(int argc, const char *argv[]) {
  PatientType example;

  string drName = "Mr.Scott";

  example.setDrName(drName);
  // ERROR No viable conversion from 'std::__1::string aka 'basic_string<char, char_traits<char>,     allocator<char> >') to 'DoctorType'
}

我期望它可以编译,因为我正在将字符串传递给我认为可以接受字符串的Patient类型。

2 个答案:

答案 0 :(得分:0)

问题出在这里:

void PatientType::setDrName(DoctorType drName)

在这里,您希望发送一个DoctorType参数。但是,在致电时您使用:

example.setDrName(drName);,其中drNamestring,而不是DoctorType参数。

解决方法很明显:修改原型以使其接受string参数,或者在调用方法时为其赋予DoctorType参数。

答案 1 :(得分:0)

问题是此功能:

void PatientType::setDrName(DoctorType drName) {

此处,此函数需要使用DoctorType类型的参数,但您正在传递std :: string。

example.setDrName(drName); // drName is std::string. So, Type mismatch

有很多解决方法:

选项1:将函数签名更改为void PatientType::setDrName(const std::string &drName) {

选项2:比较简单,但可以。在DoctorType中定义一个参数化的构造函数,并接受std::string作为参数。

赞:

DoctorType::DoctorType(const std::string &name): name(name) { }

我认为方案2适合您的情况。

正如@t.niese所正确建议的那样,您必须显式创建DoctorType对象,并将构造函数定义为显式。像这样:

explicit DoctorType::DoctorType(const std::string &name): name(name) { }

同时调用它:

example.setDrName(DoctorType(drName));