C2665: 没有重载函数可以转换所有参数类型

118行这里,我在参数列表这里传的是string类型的album_name,为什么不行,我对应的构造函数就是string

img


#include<iostream>
#include<string>
#include<vector>
#include<conio.h>
using namespace std;

class Album;
class Singer;
void shuanghengxian()
{
    cout << "========================================================================================" << endl;
}

void bolangxian()
{
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
}

class Album    //专辑类
{
public:
    string name;    //专辑名
    Singer* singer;    //演唱者
    Album(string name, Singer* singer)
    {
        this->name = name;
        this->singer = singer;
    }
};


class Singer    //歌手类
{
public:
    string name;    //姓名
    //vector<string>songs;    //所有歌曲名
    Singer(string name)
    {
        this->name = name;
    }
};
class Song    //歌曲类
{
public:
    string name;    //歌名
    Album* album;    //专辑
    Singer* singer;    //演唱者
    Song(string name,  Album* album)
    {
        this->name = name;
        this->album = album;
        this->singer = album->singer;
    }
    void viewSingerProfile();    //查看歌手资料
    void viewAlbumProfile();    //查看专辑资料
};



void Song::viewAlbumProfile()
{
    cout << "专辑名:" << this->album->name << endl;
}
void Song::viewSingerProfile()
{
    cout << "歌手名:" << this->singer->name << endl;
}


class Player    //播放器类
{
public:
    vector<Song>* list;    //播放列表
    int mode;    //播放模式
    Player()
    {

    }
    Player(vector<Song>* list)
    {
        this->list = list;
        //showList();
    }
    void showList();    //显示播放列表
    void chooseOperation();    //提示选择操作
    void manageSongs();    //管理歌曲
    void add();    //添加歌曲
    void _delete();    //删除歌曲
    void play();    //播放
    void pause();    //暂停
    void previous();    //上一曲
    void next();    //下一曲
    void chooseMode();    //提示选择播放模式
    void viewSongProfile();    //查看歌曲详情
    void displayResults();    //反馈操作结果
};
void Player::chooseMode()
{

}
void Player::chooseOperation()
{
    cout << "1.管理歌曲" << endl << "2.播放歌曲" << endl << "3.查看歌曲" << endl;
}
void Player::displayResults()
{

}
void Player::add()
{
    string singer_name;
    string album_name;
    string song_name;
    cout << "请输入您想添加的歌曲的 歌名 歌手 专辑:" << endl;

    cin >> song_name >> singer_name>> album_name;
    Singer singer(singer_name);
    Album album(album_name, &singer_name);

    Song song(song_name, &album);
    (*list).push_back(song);
}
void Player::next()
{

}
void Player::pause()
{

}
void Player::play()
{

}
void Player::previous()
{

}
void Player::showList()
{
    for (int i = 0; i < 10; i++)
    {
        cout << i + 1 << "." << "歌名:" << (*list)[i].name << "\t" << "歌手:" << (*list)[i].singer->name << "\t" << "专辑:" << (*list)[i].album->name << endl;
    }
}
void Player::viewSongProfile()
{

}
void Player::_delete()
{
    cout << "请输入您想删除的歌曲序号:" << endl;
    shuanghengxian();
}

void Player::manageSongs()
{
    while (1)
    {
        char c = _getch();

        switch (c)
        {
        case '1':
            add();
            break;
        case '2':
            _delete();
            break;

        default:
            printf("请重新输入1-2中的数字\n");
            ////暂停程序
            //system("pause");
            ////清空控制台
            //system("cls");
            //break;

        }
    }
}





class User    //用户类
{
public:
    int operation;    //操作
    void sendOperation(Player* player, int Operation);
    //{
    //    /*{
    //        switch (Operation)
    //        {
    //        case 1:
    //            (*player).manageSongs();

    //        case 2:

    //        }
    //    }*/
    //}

};




void _Operation()    //操作函数
{
    cout << "1.管理歌曲" << endl << "2.播放歌曲" << endl << "3.查看歌曲" << endl;
    shuanghengxian();
}

void system_songs(vector<Song>& _songs)
{
    //Singer* singer1 = new Singer("薛之谦"); // 改成new
    Singer* singer1 = new Singer("薛之谦");
    //singer1.songs.push_back("怪咖");    此处可添加歌手具体信息,对于此播放器操作功能有限,可不实现
    Album* album1 = new Album("沉默羔羊", singer1);
    Song song1("演员",  album1);
    _songs.push_back(song1);
    Singer* singer2 = new Singer("伍佰");
    Album* album2 = new Album("几时回忆", singer2);
    Song song2("突然的自我", album2);
    _songs.push_back(song2);
    Singer* singer3 = new Singer("陈一发儿");
    Album* album3 = new Album("电竞贾玲", singer3);
    Song song3("童话镇",  album3);
    _songs.push_back(song3);
    Singer* singer4 = new Singer("李荣浩");
    Album* album4 = new Album("小眼帅哥", singer4);
    Song song4("作曲家", album4);
    _songs.push_back(song4);
    Singer* singer5 = new Singer("邓紫棋");
    Album* album5 = new Album("腿长一米五", singer5);
    Song song5("喜欢你", album5);
    _songs.push_back(song5);
    Singer* singer6 = new Singer("周杰伦");
    Album* album6 = new Album("Jay", singer6);
    Song song6("简单爱", album6);
    _songs.push_back(song6);
    Singer* singer7 = new Singer("Beyond");
    Album* album7 = new Album("超越", singer7);
    Song song7("光辉岁月", album7);
    _songs.push_back(song7);
    Singer* singer8 = new Singer("陈奕迅");
    Album* album8 = new Album("我叫eason", singer8);
    Song song8("十年",  album8);
    _songs.push_back(song8);
    Singer* singer9 = new Singer("张国荣");
    Album* album9 = new Album("峥嵘岁月", singer9);
    Song song9("当爱已成往事",  album9);
    _songs.push_back(song9);
    Singer* singer10 = new Singer("许嵩");
    Album* album10 = new Album("年少回忆", singer10);
    Song song10("南山忆", album10);
    _songs.push_back(song10);
    /*for (int i = 0; i < 10; i++)
    {
        cout << i + 1 << "." << "歌名:" << _songs[i].name << "\t" << "歌手:" << _songs[i].singer->name << "\t" << "专辑:" << _songs[i].album->name << endl;
    }*/
}


int main(void)
{
    User user;
    vector<Song>_songs;
    system_songs(_songs);
    Player player(&_songs);
    bolangxian();
    cout << "欢迎使用控制台音乐播放器" << endl;
    bolangxian();
    player.showList();
    shuanghengxian();
    cout << "已展示当前所有歌曲,请选择您的操作:" << endl;
    _Operation();

    
}

根据你截图提供的报错信息:在第118行 Album 类的构造函数中,需要传递一个 Singer* 类型的指针作为参数,而你传递的参数 &singer_name 的类型是 string*,因此类型不匹配,编译器会报错。

img


所以,你需要先创建一个 Singer 对象,然后将该对象的地址作为参数传递给 Album 构造函数,例如:

Singer* singer = new Singer(singer_name);
Album* album = new Album(album_name, singer);
Song song(song_name, album);
(*list).push_back(song);


代码使用了 new 关键字来动态创建 Singer 和 Album 对象,并使用它们在堆上分配的内存的地址来创建 Song 对象。注意,在程序结束时,需要释放这些内存,否则会出现内存泄漏。