C++ 声明与“;消息::保存(<;错误类型>;&;fol)&x201D;

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

在Message.h中,我定义了两个类:Message、Folder。当我试图为Message定义一个成员函数save()时,它说:声明与“Message::save(&fol)”不兼容。此错误发生在save()和remove()的定义部分

但是,我检查声明中的文件夹和定义中的文件夹是否相同。文件夹类也定义如下。所以我想知道为什么它说文件夹是一种错误类型

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类时,还要补充一个结论,即在编程之前尝试弄清楚结构和顺序。注意不要涉及未声明或未定义的内容。