无法转换地图<string,class =“”>赋值中的值</string,>

时间:2014-09-07 06:46:33

标签: c++ map

我正在处理一项工作,我发现了以下错误,无法修复。有人可以解释这个错误并提供解决方案吗?代码的最后一晚是发生错误的地方。任何见解都将不胜感激。

81:43:错误:无法转换专辑&#39;到#std :: map,专辑*&gt; :: mapped_type {aka album *}&#39;在任务中

class song {
    public:
        string title;
        int time;
        int track;

};

class album{
    public:
        map <int, song *> songs;
        string name;
        int time;
};

class artist{
    public:
        map <string, album *> albums;
        string name;
        int time;
        int nsongs;
};

int main (int argc, char* argv[]){
    song song;
    album album;
    artist artist;
    const string file = argv[1];
    ifstream infile;
    infile.open(file.c_str());
    int itime;
    int secs, mins, hours;
    char extra;
    string stitle, stime, sartist, salbum, sgenre, strack;
    stringstream ss;

    if(infile.fail()){
        cerr << "Could not open file" << endl;
        exit (1);
    }

    while (infile >> stitle >> stime >> sartist >> salbum >> sgenre >> strack){
        replace(stitle.begin(), stitle.end(), '_', ' ');
        song.title = stitle;
        ss << stime;
        ss >> mins >> extra >> secs;
        itime = (mins * 60) + secs;
        ss.str("");
        ss.clear();
        mins = itime/60;
        secs = itime%60;
        song.time = itime;

        song.track = atoi (strack.c_str());
        replace(salbum.begin(), salbum.end(), '_', ' ');
        album.name = salbum;

        replace(sartist.begin(), sartist.end(), '_', ' ');
        artist.name = sartist;
        if(artist.albums.count(artist.name)  == 1){
            cout << "Old Artist: " << artist.name << endl;
            cout << "New Artist: " << artist.name << endl;
        }
        else{artist.albums[artist.name] = album;}

2 个答案:

答案 0 :(得分:0)

你试图将'album'对象分配给'album'类型的指针,假设你有一个指向已分配内存的有效指针,你可以编写类似

的内容
else{*(artist.albums[artist.name]) = album;}

因为我没有看到指针的任何内存分配,所以在将内容插入地图之前你必须自己分配内存,例如

else{artist.albums[artist.name] = new album();}

请记得在程序结束时释放此内存

答案 1 :(得分:0)

没有明显的理由使用指针。只需写下:

class song {
    public:
        string title;
        int time;
        int track;

};

class album{
    public:
        map <int, song> songs;
        string name;
        int time;
};

class artist{
    public:
        map <string, album> albums;
        string name;
        int time;
        int nsongs;
};

songalbum(和artist)都看起来像值类。这意味着单个对象没有标识,并且可以比较对象的相等性。这些类通常不会与指针一起使用。

std::string本身是价值类的另一个(非常典型的)示例。您通常不存储指向字符串的指针或传递或返回字符串指针。您很少会看到std::map<int, std::string*>std::list<std::string*>f(std::string* s)std::string* f()之类的内容。

实际上,int本身也是一种值类型。这就是std::map<int, int*>std::list<int*>f(int* i)int* f()之类的内容可疑的原因。

就您的代码而言,歌曲,专辑和艺术家就像字符串和整数。


顺便说一句,您的代码还有其他一些问题:

int itime;

这看起来像微软风格的匈牙利表示法,我喜欢称之为90年代的失败实验。只需调用变量time

string stitle, stime, sartist, salbum, sgenre, strack;

同样在这里。如果你需要两个具有不同类型的相同名称的变量(这不应该经常发生),请明确它并称之为time_as_integertime_as_string

while (infile >> stitle >> stime >> sartist >> salbum >> sgenre >> strack)

如果其中一个标题碰巧是&#34;那么这个循环将会是什么?让它成为&#34; ?您需要一个更强大的机制。使用std::getline读取整行,并使用Boost Tokenizer之类的东西进行拆分。

atoi (strack.c_str());

atoi无法区分"0""""a"等无效输入。在任何情况下它都将返回0。使用字符串流或C ++ 11 stoi


P.S。:请发布可编辑的代码。为了重现您的错误,必须手动添加以下所有内容,这非常繁琐:

#include <string>
#include <fstream>
#include <map>
#include <sstream>
#include <iostream>
#include <stdlib.h>
#include <algorithm>

using namespace std; // just for throwaway test code

您还必须添加

    }
}

在代码的末尾。

即使进行了这些修改,您的代码也不会达到81行。