Это должно читаться так:
#ifndef LIGHT_H
#define LIGHT_H
class Light
{
public:
Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex);
virtual ~Light();
float x,y,z;
int index;
int type;
struct
{
float r, g, b, a;
} ambient;
struct
{
float r, g, b, a;
} diffuse;
struct
{
float r, g, b, a;
} specular;
protected:
private:
};
#endif // LIGHT_H
Основная проблема заключается в том, что вы заявляли о существовании структур и давали имя типа, но вы не объявляли какие-либо переменные этого типа. Поскольку из вашего использования было ясно, что тип этих структур не нуждается в имени (они могут быть анонимными структурами), я переместил имя после объявления, чтобы вы объявили переменную.
Как указал GMan, это все еще не оптимально. Вот лучший способ сделать это:
#ifndef LIGHT_H
#define LIGHT_H
class Light
{
public:
Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex);
virtual ~Light();
float x,y,z;
int index;
int type;
struct Color {
float r, g, b, a;
};
Color ambient, diffuse, specular;
protected:
private:
};
#endif // LIGHT_H