我正在处理一项工作,我发现了以下错误,无法修复。有人可以解释这个错误并提供解决方案吗?代码的最后一晚是发生错误的地方。任何见解都将不胜感激。
81:43:错误:无法转换专辑'到#std :: map,专辑*> :: mapped_type {aka album *}'在任务中
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;}
答案 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;
};
song
,album
(和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_integer
和time_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行。