C++代码报错:int转std::__cxx11::string请求失败,求问题排查
我是编程新手,长期潜水首次发帖。正在为学校项目基于已有代码构建程序,但出现大量错误,尤其是string使用、strcpy调用和const构造函数相关问题。
报错信息:
error: conversion from 'int' to non-scalar type 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' requested
出错的代码
CPP文件
#include "taxi.h" #include <iostream> #include <stdint.h> #include <string> #include <cstring> using namespace std; Taxi::Taxi(){ int interno = 0; string marca = 'Marca'; string patente = 'AA 00 AA'; string Propietario = 'Apellido, Nombre'; int chofer = 0; fadia = 1; fames = 1; fanio = 1970; fbdia = 1; fbmes = 1; fbanio = 1970; double tel = 0; } Taxi::Taxi(int inter, string marc, string pat, string prop, int ch, int dia_a, int dia_b, int mes_a, int mes_b, int anio_a, int anio_b, double te){ int interno = inter; string marca = marc; string patente = pat; string propietario = prop; int chofer = ch; fadia = dia_a; fames = mes_a; fanio = anio_a; fbdia = dia_b; fbmes = mes_b; fbanio = anio_b; double tel = te; } Taxi::~Taxi(){ cout<<"Destructor Activado. Fin del Programa."<<endl; } void Taxi::setPropietario(string prop){ strcpy(propietario, prop); } void Taxi::setChofer(int ch){ int chofer = ch; } void Taxi::imprimir(){ cout<<"Chofer en Servicio: "<<"\n -"<<chofer<<"\n -"<<propietario <<"\n -"<<tel<<endl; cout<<"Vehiculo en Servicio: "<<"\n -"<<marca<<"\n -"<<patente<<endl; cout<<"Fecha de alta: "<<fadia<<"/"<<fames<<"/"<<fanio<<endl; cout<<"Fecha de baja: "<<fbdia<<"/"<<fbmes<<"/"<<fbanio<<endl; }
头文件(taxi.h)
#ifndef TAXI_H #define TAXI_H #endif // TAXI_H #include <iostream> #include <stdint.h> #include <string> #include <cstring> class Taxi{ private: int interno; std::string marca; std::string patente; std::string propietario; int chofer; int fadia; int fames; int fanio; int fbdia; int fbmes; int fbanio; double tel; public: Taxi(); Taxi(int inter, std::string marc, std::string pat, std::string prop, int ch, int dia_a, int dia_b, int mes_a, int mes_b, int anio_a, int anio_b, double te); Taxi(const Taxi &); ~Taxi(); void setPropietario(std::string prop); void setChofer(int inter); void imprimir(); void imprimirtaxi(); };
错误修复步骤
字符串初始化错误:构造函数中用单引号
'包裹字符串(如'Marca'),单引号仅适用于单个字符,多个字符会被编译器解析为整数,触发int转std::string的报错。改为双引号"Marca"即可。同时注意:构造函数中是给类成员变量赋值,不要重新声明局部变量(比如int interno = 0;要改成interno = 0;,否则成员变量不会被赋值)。构造函数局部变量遮蔽成员变量:两个构造函数都重新定义了与成员变量同名的局部变量(如
int interno = inter;),导致成员变量未被正确初始化。去掉类型声明,直接给成员变量赋值:Taxi::Taxi(){ interno = 0; marca = "Marca"; patente = "AA 00 AA"; propietario = "Apellido, Nombre"; chofer = 0; fadia = 1; fames = 1; fanio = 1970; fbdia = 1; fbmes = 1; fbanio = 1970; tel = 0; }带参数的构造函数同理,修改后:
Taxi::Taxi(int inter, string marc, string pat, string prop, int ch, int dia_a, int dia_b, int mes_a, int mes_b, int anio_a, int anio_b, double te){ interno = inter; marca = marc; patente = pat; propietario = prop; chofer = ch; fadia = dia_a; fames = mes_a; fanio = anio_a; fbdia = dia_b; fbmes = mes_b; fbanio = anio_b; tel = te; }strcpy使用错误:
strcpy是C语言中用于复制C风格字符串(char*)的函数,不能直接用于std::string。std::string直接用赋值运算符=即可修改值,修改setPropietario函数:void Taxi::setPropietario(string prop){ propietario = prop; }setChofer函数错误:同样存在局部变量遮蔽成员变量的问题,改为直接赋值:
void Taxi::setChofer(int ch){ chofer = ch; }头文件预处理指令位置错误:
#endif // TAXI_H放在了头文件开头,导致后续类定义和头文件包含被排除,编译时找不到Taxi类定义。将#endif移到文件末尾:#ifndef TAXI_H #define TAXI_H #include <iostream> #include <stdint.h> #include <string> #include <cstring> class Taxi{ // ... 类定义 ... }; #endif // TAXI_H未实现拷贝构造函数:头文件声明了
Taxi(const Taxi &);但未实现,可添加实现(成员均为基本类型和std::string,默认拷贝逻辑足够),或删除该声明。实现示例:Taxi::Taxi(const Taxi &other){ interno = other.interno; marca = other.marca; patente = other.patente; propietario = other.propietario; chofer = other.chofer; fadia = other.fadia; fames = other.fames; fanio = other.fanio; fbdia = other.fbdia; fbmes = other.fbmes; fbanio = other.fbanio; tel = other.tel; }
内容的提问来源于stack exchange,提问作者Facundo zanatta

