Хорошо, короче говоря, ошибка была вызвана отсутствием Форвардных объявлений .
Обратите внимание, что класс ArtistPlaysNode
имеет shared_ptr типа MostPlayedListNode
и типа SongPlaysNode
как его участники. И в то же время класс MostPlayedList
имеет shared_ptr типа ArtistPlaysNode и типа SongPlaysNode
в качестве членов.
Кроме того, ArtistPlaysNode
и SongPlaysNode
являются производными от TreeNode
class.
Это создает сценарий, в котором эти классы имеют члены другого типа, почти циклически c.
Обычно это приводит к ошибкам типа:
expected class name before '{' token.
как видно из этого вопроса
Или это может вызвать ошибку типа:
'NAME' was not declared in this scope
как видно из введите описание ссылки здесь
Чтобы решить эту проблему, нам нужно либо убедиться, что все, на что опирается класс, функция или заголовок, объявлено перед его использованием.
Или нам нужно предоставить компилятору предварительные объявления, которые позволят компилятору распознавать этот класс без его полного определения.
В случае мой код, исправление было добавление предварительных объявлений в классе F файлов MostPlayedListNode
, SongPlaysNode
и ArtistPlaysNode
.
, например, верхняя часть обновленного файла MostPlayedListNode.h
:
using std::shared_ptr;
using std::make_shared;
class ArtistPlaysNode; // this is a forward declaration
class SongPlaysNode; // this is a forward declaration
class MostPlayedListNode {
private:
int numberOfPlays;
shared_ptr<ArtistPlaysNode> artistPlaysTree;
shared_ptr<ArtistPlaysNode> ptrToLowestArtistId;
shared_ptr<SongPlaysNode> ptrToLowestSongId;
shared_ptr<MostPlayedListNode> previous;
shared_ptr<MostPlayedListNode> next;
public:
и обновленный файл ArtistPlayesNode.h
:
using std::shared_ptr;
using std::make_shared;
class SongPlaysNode; // this is a forward declaration
class MostPlayedListNode; // this is a forward declaration
class ArtistPlaysNode : public TreeNode {
private:
int artistId;
shared_ptr<SongPlaysNode> SongPlaysTree;
shared_ptr<MostPlayedListNode> ptrToListNode;
public:
В заключение, при записи определенных структур данных, предварительные объявления важны для того, чтобы компилятор распознал все необходимые объекты, если они еще не определены когда они нужны объекту, ссылающемуся на них. В моем коде мне были нужны предварительные объявления для учета Mutual Recursion , но это не всегда так.