我已经在.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文件中,我在typedef名称空间中声明了Particle。我想做的是实例化“粒子”结构并将其推入向量。由于我有一个空的构造函数,因此我相信仅用Particle()进行实例化就应该起作用。但是,我不能这样做,因为编译器认为加粗行中存在“不允许不完整的类型”错误。 particles.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(我用来编译和构建)没有链接头文件,但未出错。相反,它的行为就像不存在Y一样,如果我们查看“不完整类型”的定义:
没有定义的结构,联合或枚举
该错误现在很有意义。 “解决方法”解决方案是使用.h文件而不是.hpp,因此它将被链接。 另外,正如@YSC在接受的答案中指出的那样,无需使用typedef,因为定义是从.h文件中正确提取的,因此不会出现任何错误。
答案 0 :(得分:8)
您的typedef
不需要,不需要和破坏。的确,typedef struct Particle Particle;
是一种C主义。在C ++中,struct x {...};
在范围内引入了名称x
,而无需在名称前加上struct
。
保持简单:
#include <vector>
struct Particle { /* ... */ }; // in real life, this is defined in a separate file
std::vector<Particle> GlobalVariablesAreEvil;
int main()
{
GlobalVariablesAreEvil.push_back(Particle{});
}