Нераспознанный тип - «Ошибка: переменная« [var-name] »не является именем типа» - PullRequest
4 голосов
/ 14 января 2012

Я создаю класс для работы с физикой как часть проекта. Нам сказали использовать класс, который обрабатывает произвольное поведение.

Я создал класс, который будет обновлять внутреннее состояние на основе предоставленных ему модулей (код следует). Однако структура, представляющая внутреннее состояние PhysicsData, не распознается нигде, кроме своего собственного файла. Кто-нибудь может пролить свет?

(Извините за большой объем информации, но разрыв между объектом, являющимся проблемой, и местом, где он возникает, довольно велик, и сокращение дополнительных деталей также удаляет контекст, который может быть полезен)

Вот структура, о которой идет речь:

#pragma once

// This file "PhysicsBehaviourBase.h"

#include <d3dx9.h>
#include <vector>

struct PhysicsData
{
public:
    D3DXVECTOR3 velocity;
    D3DXVECTOR3 position;
    D3DXVECTOR3 rotation;
    float size;

    PhysicsData();
    void add(const PhysicsData& pd);
};

Все ссылки на PhysicsData в остальной части этого файла в порядке. Однако этот файл начинает намекать на проблемы:

#pragma once
// This file: "PhysicsBehaviours.h"

#include "PhysicsBehavioursBase.h"

class GravityConstant : public PhysicsBehaviour
{
private:
    float g; // Gravitational constant

    // Required by the PhysicsBehaviour interface.
    PhysicsBehaviour* copy() const {return new GravityConstant(g);}
public:
    GravityConstant(float accelleration_due_to_gravity = 9.81)
        : g(accelleration_due_to_gravity) {}

    // Required by the PhysicsBehaviour interface.
    void update(float time,const PhysicsData&, PhysicsData* out)
        {out->velocity.y -= g*time;}
};

В строке void update(float time,const PhysicsData&, PhysicsData* out) обе ссылки на PhysicsData содержат сообщение об ошибке IntelliSense:

Physics PhysicsData 

Error: variable "PhysicsData" is not a type name.

Понятия не имею, почему IntelliSense считает PhysicsData переменной типа Physics. (Physics - это тип, который я объявляю следующим, а PhysicsData - это один из параметров, используемых для построения физического объекта).

Однако на этом этапе нет ошибки компилятора. Ошибка компилятора происходит в следующем файле вверх по иерархии:

#pragma once

// "Physics.h"

#include "Timing.h"
#include "PhysicsBehaviours.h"
#include <d3dx9.h> // For D3DXVECTOR3
#include <vector>

class Physics
{
private:
    std::vector<PhysicsBehaviour*> behaviours_;
    Timing timer;
    PhysicsData data;
    void addBehaviours(const BEHAVIOUR_LIST&);
public:
    Physics(const PhysicsData&,const BEHAVIOUR_LIST&);
    ~Physics() {}
    void update();
    PhysicsData state() const {return data;}
    float age() const {return timer.age();}
};

Обе ссылки на PhysicsData получают ту же ошибку IntelliSense, что и выше. Ошибки компилятора указывают на эту функцию:

#include "Physics.h"
// "Physics.cpp"

Physics(const PhysicsData& initalState,const BEHAVIOUR_LIST& behaviour) // Line 4
    : data(initialState) // Line 5
{ // Line 6
    addBehaviours(behaviour);
}

Ошибки компиляции:

1>  Physics.cpp
1>[PATH]\physics.cpp(4): error C2226: syntax error : unexpected type 'PhysicsData'
1>[PATH]\physics.cpp(5): error C2065: 'initialState' : undeclared identifier
1>[PATH]\physics.cpp(6): error C2448: 'data' : function-style initializer appears to be a function definition

И другие ошибки IntelliSense: Под & в const PhysicsData& из строки 4:

Error: this declaration has no storage class or type specifier.

Под закрывающей скобкой в ​​строке 4:

Error: expected a declaration.

Любые подсказки, исправления или гипотезы приветствуются.

1 Ответ

4 голосов
/ 14 января 2012

Вам не хватает спецификатора класса из определения конструктора в Physics.cpp:

Physics::Physics(const PhysicsData& initalState,const BEHAVIOUR_LIST& behaviour)
^^^^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...