1

问题

我有两个类:一个 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: use of undefined type 'Mat4'

正如你所看到的,我已经在它们各自的定义之前声明了这两个类

class Mat4;
class Vec4;

任何关于我如何在不引起这些比赛问题的情况下拥有这个操作员的建议都将非常感激。

4

2 回答 2

0

问题出现了,因为您在同一个文件中有定义和实现。尝试将定义(原型)拆分为头文件,仅使用指向另一个类的指针并将实现放入单独的 c++ 文件中,该文件包括头文件和另一个类的头文件。

基本上它是在告诉你,它确实知道有一个 Mat4 和一个 Vec4 类……但它对它一无所知,除非你告诉它去哪里看。

于 2013-08-30T11:12:04.277 回答
0

前向声明在这里是不够的。这告诉编译器这是一个 Mat4 类型,仅此而已。虽然您可以在签名中使用它(带有指针和引用),但在定义之前无法使用它。因此,您需要将声明和定义拆分为单独的文件。

于 2013-08-30T11:15:18.427 回答