Почему я получаю ошибку C2061 (синтаксическая ошибка: идентификатор)? - PullRequest
2 голосов
/ 21 ноября 2010

Хорошо ... Я боролся с этой ошибкой по крайней мере час. Мой класс 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 Ответ

2 голосов
/ 21 ноября 2010

Какой смысл декларации class Component;, если вы все равно включите Component.h?Вы не можете унаследовать от неполного типа, поэтому это объявление не имеет смысла.

Дикая догадка состоит в том, что круговые проблемы включают в себя, но действительно трудно сказать без дополнительной информации.Я рекомендую прочитать эту статью на Организация файлов кодов на C и C ++ , если вы не знаете предмета.

Редактировать:

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

Нельзя передать тип StaticSprite методу.Это, вероятно, источник ошибки.Покажите нам декларацию addComponent.Каков первый тип параметра?

Редактировать:

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

Хорошо, так каково определение TYPE?Я думаю, это просто typedef для int или что-то?В этом случае должно быть ясно, что вы не можете назначить тип 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());

(Является ли эта вещь перечисления всего типа хорошей идеей, это другой вопрос.)

...