Ошибка: поле имеет неполный тип - PullRequest
6 голосов
/ 22 октября 2010

quaternion.h: 15: ошибка: поле 'v' имеет неполный тип

Привет!Я застрял на ошибке, которую я не могу решить.

Ниже мой код:

#ifndef QUATERNION_H
#define QUATERNION_H

#include "vec3.h"

class Vec3;

class Quaternion
{

public:

 Quaternion(Vec3 v);

 Quaternion(double w, Vec3 v);

 Vec3 v; <--------------------------This is where the error is :(

 double scalar;



 Quaternion operator *(Quaternion s);

 Quaternion conjugate();

};



#endif

Мой Vec.h выглядит так:

#ifndef VEC3_H

#define VEC3_H



#include "point.h"

#include "quaternion.h"

#include <math.h>

class Quaternion;


class Vec3

{

 friend ofstream& operator <<(ofstream& output, const Vec3& p);

 friend ifstream& operator >>(ifstream& input, Vec3& p);



 public: 

 Vec3();

 Vec3(double _x, double _y);

 Vec3(double _x, double _y, double _z);



 double x,y,z;



 //Operators

 Vec3 operator -(Vec3 a) const;

 Vec3 operator /(double s) const;

 Vec3 operator *(double s) const;

 Vec3 operator *(Quaternion q) const;



 // Used to do vector Vec3 addition

 Vec3 operator +(Vec3 a) const;

 Point operator +(Point a) const;



 Vec3& operator =(Point a);



 Vec3 crossProduct(Vec3 v1); // Itself cross v1

 double dotProduct(Vec3 v);

 double length();

 void normalize();


};



#endif

Еще раз спасибо за помощь =)

Ответы [ 3 ]

10 голосов
/ 22 октября 2010

Ну, у вас есть циклическое включение двух заголовочных файлов: vec3.h и quaternion.h.Включите охранников, чтобы убедиться, что каждый заголовок включен только один раз.Один из них будет включен первым, другой - вторым.В вашем случае quaternion.h включается первым, что означает, что Vec3 становится неполным типом в нем.Это то, что говорит вам компилятор.

Поскольку вы пытаетесь использовать объект Vec3 в качестве непосредственного члена объекта Quaternion, вам абсолютно необходимо, чтобы Vec3 был полным типом.Заголовок quaternion.h должен включать заголовок vec3.h.Декларация

class Vec3;

абсолютно ничего не достигает в quaternion.h, так что вы можете просто удалить ее.

С учетом вышеизложенного следует, что vec3.h не может quaternion.h, или вы получите круговое включение, которое никогда ничего не достигнет.Снимите включение quaternion.h с vec3.h.Сохраните объявление

class Quaternion;

в vec3.h и посмотрите, работает ли оно таким образом.

3 голосов
/ 22 октября 2010

Проблема заключается во взаимном включении .h. Компилятор знает типы, но в какой-то момент они неполные. Мой совет - просто объявить Quarternion в файле vec3.h, но НЕ включать quaternion.h.

Тогда quaternion.h может включать vec3.h, и все скомпилируется. Также, как предложил JaredPar, удалите предварительное объявление Vec3 в quaternion.h.

0 голосов
/ 22 октября 2010

проблема в том, что ваши файлы включены друг в друга, где нет циклической зависимости. vec3 не должен включать кватернион, тогда все будет хорошо.

Теперь ошибка, выданная компилятором, заключается в том, что вы объявили vec3, но полное определение не читается, если включено vec3:

vecr3.h -> включить кватернион
quaternion.h -> include vec3, но include-guard, поэтому ничего не происходит
quaternion.h -> предварительное объявление Vec3,
quaternion.h -> попытаться использовать vec3 // fail
vec3.h -> фактически объявить vec3

единственный правильный порядок - это первое включение vec3 и только ТОГДА кватернион.

...