Я определил класс частиц Particle в файле .hpp следующим образом
#ifndef PARTICLE_HPP
#define PARTICLE_HPP
#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GL/gl.h>
#include <vector>
struct Particle
{
Particle()
: m_Position(0.0f)
, m_Velocity(0.0f)
, m_Color(1.0f)
, m_fRotate(0.0f)
, m_fAge(0.0f)
, m_fLifeSpan(0.0f)
, m_is_alive(false)
{}
public:
glm::vec3 m_Position; // Center point of particle
glm::vec3 m_Velocity; // Current particle velocity
glm::vec4 m_Color; // Particle color
GLfloat m_fRotate; // Rotate the particle the center
GLfloat m_fSize; // Size of the particle
GLfloat m_fAge;
GLfloat m_fLifeSpan;
bool m_is_alive;
};
В другом файле .cpp я объявил Particle в пространстве имен typedef.То, что я пытаюсь сделать, это создать экземпляр структуры частиц и вставить их в вектор.Так как у меня есть пустой конструктор, я считаю, что создание экземпляра с помощью только Particle () должно работать.Тем не менее, я не смог этого сделать, потому что компиляция утверждает, что в жирной строке есть ошибка «неполный тип не разрешен». beans.push_back (Particle ());
#include "Particle.hpp"
#include <stdlib.h> //malloc
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include<vector>
typedef struct Particle Particle;
typedef std::vector<Particle> ParticleBuffer;
ParticleBuffer particles;
int main(){
GLuint nr_particles = 100;
for (GLuint i = 0; i < nr_particles; ++i) {
particles.push_back(Particle());
}
}
Решение
Использование typedef исключило реальную проблему, и этонаходится в
typedef struct Y Particle;
Здесь Y никогда не определялся, так как я полагал, что это извлечение определения из файла заголовка (.hpp), но по какой-то причине Microsoft Visual Studio (которую я использовал для компиляции& build) не связывал заголовочный файл, но не выдавал ошибок.Вместо этого он просто вел себя так, как будто Y не существует, и если мы посмотрим на определение «неполного типа»:
Структура, объединение или перечисления, которые не имеют определения
Ошибка теперь имеет смысл.Обходным решением было использование файла .h вместо .hpp, чтобы он связывался.Также, как указал @YSC в принятом ответе, нет необходимости использовать typedef, так как определение правильно извлечено из файла .h, оно не должно давать ошибок.