我有两个类:一个4元素向量(Vec4)和一个4x4矩阵(Mat4)。 我试图在另一个类中为另一个定义乘法运算符:
class Mat4;
class Vec4;
class Vec4
{
public:
float x, y, z, w;
const Vec4 operator *(const Mat4& m)const
{
Vec4 r;
//...
return r;
}
};
class Mat4
{
public:
Mat4()
{ //... }
union
{
Vec4 v[4];
float m[4][4];
struct
{
float _11, _12, _13, _14,
_21, _22, _23, _24,
_31, _32, _33, _34,
_41, _42, _43, _44;
};
};
const Vec4 operator *(const Vec4& x)const
{
Vec4 r;
//...
return r;
}
编译器(MSVC ++)在Vec4 :: operator *处扼流,吐出错误
C2027:使用未定义类型'Mat4'
正如您所看到的,我已经在它们各自的定义之前声明了两个类
class Mat4;
class Vec4;
关于如何在不引起这些种族问题的情况下拥有此运营商的任何建议都将非常感激。
答案 0 :(得分:0)
问题出现了,因为你在同一个文件中有定义和实现。 尝试将定义(原型)拆分为头文件,仅使用指向另一个类的指针,并将实现放入单独的c ++文件中,该文件包含头文件和另一个类的头文件。
基本上它告诉你,它确实知道,有一个Mat4和一个Vec4类......但它不知道更多关于它的信息,除非你告诉它在哪里看。
答案 1 :(得分:0)
此处前瞻声明还不够。这告诉编译器是Mat4类型,但仅此而已。虽然您可以在签名(使用指针和引用)中使用它,但在定义之前无法使用它。因此,您需要将声明和定义拆分为单独的文件。