вектор структур, дающих ошибку "не объявлен в этой области - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть структура, объявленная следующим образом:

#ifndef PLAYLIST_H
#define PLAYLIST_H
#include <iostream>
#include <string>
#include <vector>
#include "playlistitem.h"
#include "song.h"
#include "time.h"
struct Playlist {
    std::vector<Song> songs;
    Time cdTotalTime;
    int totalTime;
};

и структура Song объявлены в другом файле:

#ifndef SONG_H
#define SONG_H
#include "playlist.h"
#include "time.h"
struct Song {
    std::string title;
    std::string artist;
    std::string album;
    int track;
    Time length;
};

У меня есть оба определения структуры в заголовках, и оба #include, как они должны быть.

Когда я компилирую, я получаю ошибку в

std:vector<Song> songs;

ошибка 'Song' не была объявлена ​​в этой области

Чего мне не хватает?

Ответы [ 5 ]

4 голосов
/ 05 ноября 2011

playlist.h включает song.h

song.h НЕ ДОЛЖЕН включать playlist.h

Защитные коллекторы предотвращают бесконечную рекурсию, они не исправляют циклические зависимости.

В настоящее время song.h включает playlist.h.Затем, когда playlist.h включает song.h, ничего не происходит (из-за защиты заголовка), а Song не определяется.Так что playlist.h выдает ошибки.

1 голос
/ 05 ноября 2011

Не только ваш основной файл, но и файл, в котором объявлено Playlist, должен также #include файл, в котором Song находится в.

0 голосов
/ 05 ноября 2011

Вы можете создать прототип Song в своем заголовке, поместив struct Song; и просто включив заголовок в свой файл .c / .cpp.Это дает бонус более быстрого времени компиляции!: D

Рекурсивный включает в себя работу с включенными охранниками, если вы правильно их расположите.Я всегда стараюсь включать наименьшее количество заголовков в файлы .h, оставляя их для исходных файлов.

Кроме того, я не вижу #endif в вашем коде.Прямо сейчас я предполагаю, что ваш код действительно имеет его;)

0 голосов
/ 05 ноября 2011

Ваши заголовки включают друг друга по кругу.Это бесполезно и ненужно.Почему ваш song.h, включая playlist.h?Удалите #include "playlist.h" из song.h, и это должно исправить ошибку.

0 голосов
/ 05 ноября 2011

Определение Song должно предшествовать его использованию в определении Playlist. Так как они находятся в разных заголовках, вы должны убедиться, что заголовок для Playlist включает заголовок Song, и оба имеют надлежащие средства защиты заголовков.

...