未声明的标识符:包含标题,不是循环的

Posted

技术标签:

【中文标题】未声明的标识符:包含标题,不是循环的【英文标题】:undeclared identifier: header included, not circular 【发布时间】:2015-04-12 02:41:11 【问题描述】:

我确保没有循环依赖,并且包含头文件,希望编译器能够理解所有内容,但我错了

Edit1:还有像pragma once 这样的标头守卫

编辑2:忘记添加所有头文件

我应该更专注于提供清晰完整的内容

相关文件:

Spawner.hpp // 定义类的头文件

#pragma once

// code skipped

#include "weapon.hpp"
#include "movement.hpp"

class Spawner
private:

int spawnGapTime;
int spawnGapSet;

// If you plan to spawn finite enemies, then use constructor
int spawnLimit = -1;

EnemyTemplate* enemyData;
Weapon* givenWeapon;
Movement* givenMovement;



int ticks;

public:

Spawner(Weapon*, Movement*, EnemyTemplate*, std::vector <int>);

void update();
void spawn_enemy();
void spawn_count();

~Spawner()
    delete givenWeapon;
    delete givenMovement;
    delete enemyData;
;


;

SceneGame.hpp(一些相关代码)

#pragma once

#include <SFML\Graphics.hpp>

#include "scene.hpp"
#include "game.hpp"
#include "entity.hpp"
#include "movement.hpp"
#include "weapon.hpp"
#include "player.hpp"
#include "collisionGrid.hpp"
#include "spawner.hpp"

// forward declare

class BulletTemplate;

class SceneGame : public Scene
private:

// some code skipped

    std::vector <Spawner*> spawner_list; // the source of the problem

// more code skipped
;

SceneGame.cpp(只包含相关的构造函数)

#include "sceneGame.hpp"
#include "input.hpp"

SceneGame::SceneGame(Game* game)

    this->game = game; // need this to run the game.

    // code skipped


    // SKIP to spawner_list
    //

    std::vector<BulletTemplate*> player_weapon;

    // Typical 3-way gun
    player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, 0));
    player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, -15));
    player_weapon.push_back(new BulletTemplate("bulletPlayer", 1, 15, false, 15));

    // simple rapid fire


    bullet_Patterns.push_back(player_weapon);

    std::vector<BulletTemplate*> enemy_weapon;

    // 2 shot rapid
    enemy_weapon.push_back(new BulletTemplate("bulletEnemy", 1, 10, false, -5));
    enemy_weapon.push_back(new BulletTemplate("bulletEnemy", 1, 10, false, 5));

    bullet_Patterns.push_back(enemy_weapon);


    // initalize Movement

    std::vector<sf::Vector2f> waypoints = 
        sf::Vector2f(-100, 0),
        sf::Vector2f(-100, -100),
        sf::Vector2f(0, -100),
    ;

    //Movement* enemy_movement = new Movement(sf::Vector2f(400, 400), waypoints);

    // 
    //

    ///*
    std::vector <int> spawnParams =  60 ;

    // This is where I use the variable that compiler complained
    // Initalize the spawner
    spawner_list.push_back(new Spawner(
        new Weapon(enemy_weapon, "sequence_enemy", 60,  8 ),
        new Movement(sf::Vector2f(400, 400), waypoints),
        new EnemyTemplate(this, "enemySprite", 1, 2, false,
        sf::Vector2f(400, 400)), spawnParams));

    //*/

    // Skipping irrelevant code


即使我了解了声明和定义的基础知识,我仍然感到困惑。有什么办法可以解决这个问题

【问题讨论】:

错误是什么,发生在哪里? 将header guards 添加到您的.hpp 文件中。 在您发布的代码中SceneGame.cpp 不包含SceneGame.hpp...如果您真的希望得到任何好的帮助,您需要生成MCVE . @JBRPG 每当您开始编写代码时,从小处着手,确保它可以编译,然后进行扩展。您发布的是一个相对较大的卡盘,没有人会努力调试/查看问题所在。尝试将您的案例减少到尽可能少的情况(即,摆脱不必要的功能等)。 #include &lt;vector&gt;了吗?如果您没有认真地提出一个好问题,我们将无法帮助您。 【参考方案1】:

我也遇到过类似的大小写错误:

#include "sceneGame.hpp"

对比

#include "SceneGame.hpp"

header guard 可以说是由#pragma once 提供的。这是避免循环依赖的好主意。一些编译器支持#import 指令,这是#include 的受保护替代方案。

【讨论】:

以上是关于未声明的标识符:包含标题,不是循环的的主要内容,如果未能解决你的问题,请参考以下文章

C++ 编程错误 |未声明的标识符

C++ 对象未声明标识符

使用声明[关闭]的未声明标识符'k'

iOS Braintree Dropin ui,抛出未声明的标识符“BTAppSwitch”

未定义标识符“必需”。 '__type' 不包含这样的成员

shared_ptr 到抽象基类(成员变量)是一个未声明的标识符[重复]