C++ 声明与“;消息::保存(<;错误类型>;&;fol)&x201D;
在Message.h中,我定义了两个类:Message、Folder。当我试图为Message定义一个成员函数save()时,它说:声明与“Message::save(&fol)”不兼容。此错误发生在save()和remove()的定义部分 但是,我检查声明中的文件夹和定义中的文件夹是否相同。文件夹类也定义如下。所以我想知道为什么它说文件夹是一种错误类型C++ 声明与“;消息::保存(<;错误类型>;&;fol)&x201D;,c++,class,incompatibletypeerror,C++,Class,Incompatibletypeerror,在Message.h中,我定义了两个类:Message、Folder。当我试图为Message定义一个成员函数save()时,它说:声明与“Message::save(&fol)”不兼容。此错误发生在save()和remove()的定义部分 但是,我检查声明中的文件夹和定义中的文件夹是否相同。文件夹类也定义如下。所以我想知道为什么它说文件夹是一种错误类型 class Message { friend class Folder; public: ... //save and rem
class Message {
friend class Folder;
public:
...
//save and remove message from given folder
void save(Folder& fol);
void remove(Folder& fol);
...
private:
std::string contents;
std::set<Folder*> folders;
}
void Message::save(Folder& fol) {
folders.insert(&fol);
fol.addMsg(*this);
}
void Message::remove(Folder& fol) {
folders.erase(&fol);
fol.remMsg(*this);
}
...
class Folder{
friend class Message;
...
}
...
类消息{
朋友类文件夹;
公众:
...
//保存和删除给定文件夹中的邮件
作废保存(文件夹和文件夹);
作废删除(文件夹和文件夹);
...
私人:
std::字符串内容;
设置文件夹;
}
无效消息::保存(文件夹和文件夹){
文件夹。插入(&fol);
fol.addMsg(*本);
}
无效消息::删除(文件夹和文件夹){
文件夹。删除(&fol);
以下为remMsg(*本);
}
...
类文件夹{
好友类消息;
...
}
...
不同的编译器可能会以不同的方式告诉您此错误,但您需要更改以下几点:
类文件夹来转发声明文件夹
声明消息之前的code>
。friend类
声明不起作用
Message::save
和Message::remove
之前,需要先定义文件夹
。原因是(简单地说)编译器在编译程序的一部分时只能使用上面提供的信息,到目前为止,您只告诉它,Folder
是一个存在的类,它足以声明指向它的指针或引用,但不足以使用该类型的值(例如,它不知道fol.addMsg
的签名是什么,甚至不知道它是否存在)。如果您相应地重新排序,使所有类定义位于所有函数定义之前(在头文件和源文件的任何正常使用中都是这样),它应该编译#include <string>
#include <set>
class Folder;
class Message {
friend class Folder;
public:
//save and remove message from given folder
void save(Folder& fol);
void remove(Folder& fol);
private:
std::string contents;
std::set<Folder*> folders;
};
class Folder{
friend class Message;
void addMsg(Message &);
void remMsg(Message &);
};
void Message::save(Folder& fol) {
folders.insert(&fol);
fol.addMsg(*this);
}
void Message::remove(Folder& fol) {
folders.erase(&fol);
fol.remMsg(*this);
}
void Folder::addMsg(Message &) {}
void Folder::remMsg(Message &) {}
#包括
#包括
班级文件夹;
类消息{
朋友类文件夹;
公众:
//保存和删除给定文件夹中的邮件
作废保存(文件夹和文件夹);
作废删除(文件夹和文件夹);
私人:
std::字符串内容;
设置文件夹;
};
类文件夹{
好友类消息;
void addMsg(消息&);
无效消息(消息&);
};
无效消息::保存(文件夹和文件夹){
文件夹。插入(&fol);
fol.addMsg(*本);
}
无效消息::删除(文件夹和文件夹){
文件夹。删除(&fol);
以下为remMsg(*本);
}
无效文件夹::addMsg(消息&){}
无效文件夹::remMsg(消息&){}
希望这有帮助。可能重复“是”,答案类似。在使用friend类时,还要补充一个结论,即在编程之前尝试弄清楚结构和顺序。注意不要涉及未声明或未定义的内容。