从const char *到int的无效转换

时间:2015-07-31 14:12:27

标签: c++ c++11

我在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'

但我在findAccount(int)

中定义了findAccount(string)BankDatabase.h

有人可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

而不是

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"));

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

答案 1 :(得分:1)

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

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

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

由于您似乎没有更改字符串,因此对此问题的一个简单修复就是采用const std :: string&amp;代替。您的代码也存在其他一些问题。