私はベースクラスShape
を持っていて、仮想関数intersect()
を持っています。C++ - エラー:基本クラス仮想関数の不完全型へのメンバアクセス
HitRecord
は、同じ.h
ファイルで定義されている構造体です。
また、Shape
の子クラスはTriangle
です。私はShape::intersect()
にHitRecord
のメンバーにアクセスしようとしているが、私はエラーにerror: member access into incomplete type in base class virtual function
を得た私が子供のクラスでこれを行うが、基本クラスにすることはできませんでしたということ奇妙です。
仮想が機能していますか?
注:もう1つ奇妙なことに、私は自分のUbuntu 16.04で実行できますが、私のMacではこのエラーが発生します。
コード
struct HitRecord; // forward declaration
class Shape {
public:
virtual bool intersect(Ray& r, HitRecord& rec) {
std::cout << "Child intersect() is not implement." << std::endl;
rec.obj = this;
return false;
}
}
struct HitRecord {
float t;
vec3f p; // point coord
vec3f norm;
Shape* obj;
};
class Triangle: public Shape {
public:
Mesh* mesh_ptr;
unsigned int vertexIndex[3];
Triangle() {...}
Triangle(Mesh* m) {...}
inline bool intersect(Ray& r, HitRecord& rec);
}
inline bool Triangle::intersect(Ray& r, HitRecord& rec) {
vec3f n = cross(v1-v0, v2-v0);
float t = - (dot(n, r.origin())+d)/dot(n, r.direction());
vec3f p = r.origin() + t*r.direction();
rec.t = t;
rec.p = p;
rec.norm = unit(n);
rec.obj = this;
return true;
}
HitRecord' 'の前方宣言は、このような状況を扱うことができないのはなぜ? 'intersect()'のシグネチャにも 'HitRecord'が含まれていますが、コンパイラはエラーを投げませんか? –
不完全な型のポインタまたは参照を宣言できます。 – LogicStuff