«Неполный тип» структуры - PullRequest
       35

«Неполный тип» структуры

0 голосов
/ 14 декабря 2018

Я определил класс частиц 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, оно не должно давать ошибок.

1 Ответ

0 голосов
/ 14 декабря 2018

Ваши 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{});
}

Демонстрация в реальном времени.

...