C++ 结构向量给出错误“;未在此范围内声明”;
我有一个声明如下的结构:C++ 结构向量给出错误“;未在此范围内声明”;,c++,data-structures,vector,struct,initialization,C++,Data Structures,Vector,Struct,Initialization,我有一个声明如下的结构: #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 c
#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;
};
我在头文件中有两个结构定义,它们都应该包括在内
当我编译时,我在
std:vector<Song> songs;
std:矢量歌曲;
未在此作用域中声明错误“Song”
我遗漏了什么?不仅是你的主文件,而且声明播放列表的文件也应该包括歌曲所在的文件。不仅仅是你的主文件,但是
播放列表
所声明的文件也应该包括歌曲
所在的文件。歌曲的定义必须在播放列表
的定义中使用之前。由于它们位于不同的标题中,您应该确保播放列表
的标题包括歌曲
的标题,并且两者都有适当的标题保护。歌曲的定义必须在播放列表
的定义中使用之前。由于它们位于不同的标题中,您应该确保播放列表的标题包括歌曲的标题,并且两者都有适当的标题保护。Playlist.h包括Song.h
歌曲.h不应包括播放列表.h
头保护防止无限递归,它们不修复循环依赖
目前song.h确实包含playlist.h。然后,当playlist.h包含song.h时,不会发生任何事情(因为标题保护),并且未定义song
。因此playlist.h会产生错误。playlist.h包括song.h
歌曲.h不应包括播放列表.h
头保护防止无限递归,它们不修复循环依赖
目前song.h确实包含playlist.h。然后,当playlist.h包含song.h时,不会发生任何事情(因为标题保护),并且未定义song
。因此playlist.h会产生错误。您的标题以循环方式相互包含。这是无用和不必要的。为什么您的歌曲.h
包括播放列表.h
?从song.h
中删除#包括“playlist.h”
,这将修复错误。您的标题以循环方式相互包含。这是无用和不必要的。为什么您的歌曲.h
包括播放列表.h
?从song.h
中删除#包括“playlist.h”
,这将修复错误。您可以通过将struct song放置在标题中来创建song
的原型
并只在.c/.cpp文件中包含标题。这样做的好处是编译速度更快!:D
递归包含可以很好地使用包含防护,只要您正确地安排它们。我总是尝试在.h文件中包含最少的头,将它们留给源文件
另外,我在你的代码上没有看到一个#endif。现在,我假设您的代码实际上拥有它;) 你可以在你的头中放入struct-Song来原型化Song
并只在.c/.cpp文件中包含标题。这样做的好处是编译速度更快!:D
递归包含可以很好地使用包含防护,只要您正确地安排它们。我总是尝试在.h文件中包含最少的头,将它们留给源文件
另外,我在你的代码上没有看到一个#endif。现在,我假设您的代码实际上拥有它;) 是否确实已将歌曲的定义文件包括在文件中,定义播放列表?而且它在同一个名称空间中?你如何“按照它们应该的样子”包含它们?(提示:您没有;))请向我们显示您使用定义的文件。您确定已将歌曲
的定义文件包含在定义播放列表
的文件中吗?而且它在同一个名称空间中?你如何“按照它们应该的样子”包含它们?(提示:您不是;))请向我们展示您使用定义的文件。
std:vector<Song> songs;