为什么我收到错误C2061(语法错误:标识符)?

时间:2010-11-21 18:22:41

标签: c++ inheritance syntax-error custom-component

好的......我现在至少花了一个小时摔跤这个错误。我的StaticSprite类继承自我的Component类。但是,当我尝试实例化StaticSprite实例时,我收到错误c2016。

这是我的相关代码,如果需要,我会发布更多内容。 提前谢谢。

StaticSprite.h

#ifndef STATICSPRITE_H_
#define STATICSPRITE_H_

#include "Component.h"
#include <SFML/Graphics.hpp>
#include <string>

namespace GE
{
 class Entity;
 class Component;
 class StaticSprite : public Component
 {
 private:
  sf::Image image;
 public:
  sf::Sprite Sprite;
  StaticSprite();
  StaticSprite(std::string filename);
 };
}

#endif

Component.h

#ifndef COMPONENT_H_
#define COMPONENT_H_

#include "Entity.h"
#include "ComponentType.h"
#include <iostream>

namespace GE
{
 class Entity;
 class Component
 {
 protected:
  Entity* myEntity;
  TYPE type;
 public:
  Component();
  virtual ~Component() {}
  Entity* getEntity();
 };
}

#endif

的main.cpp

int main(int argc, char* argv[])
{
    Entity Player;
    //The first arg is just a number, and the second is the 
    //actual component to add to the Entity's component array
    Player.addComponent(StaticSprite, new StaticSprite()); //error

    //application loop
}

Entity.cpp

//TYPE is just an enumerated type
void Entity::addComponent(TYPE type, void* component)
{
Components[type] = component;
}

ComponentType.h

#ifndef COMPONENTTYPE_H_
#define COMPONENTTYPE_H_

namespace GE
{
enum TYPE{Base = 0, StaticSprite, DynamicSprite, 
    Physics, Collision, Input, Particle, Audio, Scriptable, MaxType};  
}

#endif

1 个答案:

答案 0 :(得分:2)

如果你包括class Component;,声明Component.h的重点是什么?你不能从一个不完整的类型继承,所以这个声明是没有意义的。

一个疯狂的猜测是循环包含问题,但如果没有更多信息,这真的很难说。如果您对该主题不清楚,我建议您在使用C和C ++组织代码文件中阅读this article

编辑:

Player.addComponent(StaticSprite, new StaticSprite());

您无法将类型 StaticSprite传递给方法。这可能是错误的根源。向我们展示addComponent的声明。第一个参数类型是什么?

编辑:

void Entity::addComponent(TYPE type, void* component)

好的,那么TYPE的定义是什么?我想这只是int或类似的typedef?在这种情况下,应该清楚的是,您无法将类型StaticSprite分配给int

编辑:

enum TYPE{Base = 0, StaticSprite, DynamicSprite, 
     Physics, Collision, Input, Particle, Audio, Scriptable, MaxType};
是的,你有它。 枚举器 TYPE::StaticSprite类型 StaticSprite完全无关,即使它们具有相同的名称。给枚举器一些其他名称,例如T_StaticSprite,以下代码应该起作用:

Player.addComponent(T_StaticSprite, new StaticSprite());

(整个类型枚举是否是一个好主意是一个不同的问题。)