结构的向量给出错误“未在此范围内声明”

时间:2011-11-04 20:45:49

标签: 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 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'未在此范围内声明

我错过了什么?

5 个答案:

答案 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。现在我假设你的代码实际上有它;)