我有一个声明如下的结构:
#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;
};
和struct 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;
};
我在头文件中都有两个结构定义,两者都是#included,因为它们应该是。
当我编译时,我在
收到错误std:vector<Song> songs;
错误'Song'未在此范围内声明
我错过了什么?
答案 0 :(得分:4)
playlist.h包括song.h
song.h不应包含playlist.h
标头防护可以防止无限递归,它们不会修复循环依赖。
目前song.h确实包含playlist.h。然后,当playlist.h包含song.h时,没有任何反应(因为标题保护),并且Song
未定义。所以playlist.h会产生错误。
答案 1 :(得分:1)
不仅是您的主文件,而且声明Playlist
的文件也应该#include Song
所在的文件。
答案 2 :(得分:0)
Song
的定义必须先于Playlist
的定义使用。由于它们位于不同的标头中,因此您应确保Playlist
的标头包含Song
的标头,并且两者都有正确的标头保护。
答案 3 :(得分:0)
您的标题以循环方式相互包含。这没用,也没用。为什么您的song.h
包括playlist.h
?从#include "playlist.h"
移除song.h
,这应该可以解决错误。
答案 4 :(得分:0)
您可以通过放置Song
在标题中对struct Song;
进行原型设计,只需在.c / .cpp文件中包含标题即可。这有更快的编译时间! :d
递归包括使用包含警卫的工作正常,只要您正确安排它们。我总是尝试在.h文件中包含最少量的标题,将它们保留为源文件。
另外,我没有在你的代码上看到#endif。现在我假设你的代码实际上有它;)