从const char*到int的转换无效

invalid conversion from const char* to int

本文关键字:转换 无效 int const char      更新时间:2023-10-16

我在c++中有四个文件

BankAccount.h
BankDatabase.h
Main.cpp 

BankAccount.h

#include <string>
class BankAccount
{
    public:
        BankAccount(int accNumber,const std::string& accName);
        void setAccNumber(const int accNumber);
        int getAccNumber() const;
        void setAccName(const std::string& clientName);
        std::string getAccName() const ;
    protected:
        int mAccNumber;
        std::string mAccName;
};
BankAccount::BankAccount(const int accNumber,
        const std::string& accName):mAccNumber(accNumber),mAccName(accName){}
void BankAccount::setAccNumber(const int accNumber)
{
   mAccNumber = accNumber;     
}
void BankAccount::setAccName(const std::string& accName)
{
    mAccName = accName;
}
int BankAccount::getAccNumber() const 
{
    return mAccNumber;
}
std::string BankAccount::getAccName() const {
    return mAccName;
}

BankDatabase.h

#include <map>
#include <iostream>
#include <stdexcept>
#include "BankAccount.h"
class BankDatabase
{
    public:
        BankDatabase();
        void addAccount(const BankAccount& acc);
        void deleteAccount(int accNumber);
        BankAccount& findAccount(int accNumber) 
            throw (std::out_of_range);
        BankAccount& findAccount(std::string& accName) 
            throw (std::out_of_range);
        void mergeDatabase(BankDatabase& db);
    protected:
        std::map<int,BankAccount> mAccounts;
};
BankDatabase::BankDatabase(){}
void BankDatabase::addAccount(const BankAccount& acc)
{
    std::pair<std::map<int,BankAccount>::iterator,bool> res =  
        mAccounts.insert(std::make_pair(acc.getAccNumber(),acc));
    if(!res.second)
        std::cout << "Account cannot be  added ";
}
void  BankDatabase::deleteAccount(int accNumber) 
{
    if( mAccounts.count(accNumber))
        mAccounts.erase(accNumber);
}
BankAccount& BankDatabase::findAccount(int accNumber)
    throw(std::out_of_range)
{
    auto iter =  mAccounts.find(accNumber);
    if(iter != mAccounts.end())
        return iter->second;
    throw std::out_of_range("No account number with this name ");
}
BankAccount& BankDatabase::findAccount(std::string& accName) 
    throw(std::out_of_range)
{
    for(auto& p : mAccounts) {
        if ( p.second.getAccName() == accName )
            return p.second;
    }
    throw std::out_of_range(" No account with this name ");
}

Main.cpp

#include <iostream>
#include "BankDatabase.h"
int main()
{
    BankDatabase db;
    db.addAccount(BankAccount(1,"james"));
    db.addAccount(BankAccount(2,"johnson"));
    db.addAccount(BankAccount(3,"kamal"));
    db.addAccount(BankAccount(4,"appu"));
    // find account name based on account number
    std::cout << db.findAccount(1).getAccName();
    // find account number based on account name
    std::cout << db.findAccount("james");
    // delete an account
    db.deleteAccount(db.findAccount("james").getAccNumber());
    // find the account
    std::cout << db.findAccount("james");
    //Merge database
    db.mergeDatabase(db);
    return 0;
}

在语句std::cout << db.findAccount("james");,我得到了一个错误:

错误:从'const char*'到'int'的转换无效

但我在BankDatabase.h中定义了findAccount(int)findAccount(string)

有人能帮帮我吗?

代替

BankAccount& findAccount(std::string& accName) 
使用

BankAccount& findAccount(std::string const& accName) 

当使用"james"调用函数时,不能将其转换为std::string&,但可以将其转换为临时std::string,当参数类型为std::string const&时,可以将其用作实参。

,

std::cout << db.findAccount(std::string("james"));

是一个问题,因为在std::ostreamBankAccount之间没有定义operator<<()

为findAccount定义了两个重载,一个接受int类型,另一个接受std::string引用。您试图调用它的参数不是std::string,而是c-string,即const char*。编译器现在有两个选项:

为了调用int版本,需要将const char*转换为int(这是您看到的错误)。

为了调用string版本,必须创建一个临时std::string。在此之后,必须形成对临时对象的非const引用(这是不允许的,并且您在问题中没有看到或没有显示错误)。

既然你似乎没有改变字符串,一个简单的解决这个问题的方法是接受const std::string&代替。您的代码还有其他一些问题