Декларация несовместима с «Message :: save (& fol) » - PullRequest
1 голос
/ 12 апреля 2019

В Message.h я определяю два класса: Сообщение, Папка.И когда я пытаюсь определить функцию-член save () для Message, он говорит: объявление не совместимо с «Message :: save (& fol)».Эта ошибка возникает в части определения для save () и remove ().

Однако я проверяю, что папка & в объявлении должна совпадать с папкой & в определении.И класс 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;
}

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;
...
}
...

1 Ответ

1 голос
/ 12 апреля 2019

Разные компиляторы могут сообщать вам об этой ошибке по-разному, но есть пара вещей, которые вам нужно изменить:

  1. Вам необходимо заранее объявить Folder, добавив class Folder; до объявления Message.Объявление friend class не учитывается.

  2. Вам необходимо определить Folder, прежде чем определять 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 &) {}

Надеюсь, это поможет.

...