在struct构造函数中出现错误“Expected specifier-qualifier-list”

时间:2010-12-07 04:14:38

标签: iphone c++ objective-c struct

我正在尝试编写一些代码来优化我正在编写的程序的一些Open GL函数,不幸的是,我不是C或C ++的老手,但这也是我正在做这个项目的部分原因!

所以我正在创建一个处理3x3矩阵的结构,我按如下方式定义结构:

#ifndef MATRIX3BY3_H
#define MATRIX3BY3_H
struct Matrix3by3
{
    float ix, jx, kx;
    float iy, jy, ky;
    float iz, jz, kz;

    Matrix3by3() {}

    Matrix3by3(const Matrix3by3 &matrix)
    {
        ix = matrix.ix;
        jx = matrix.jx;
        kx = matrix.kx;

        iy = matrix.iy;
        jy = matrix.jy;
        ky = matrix.ky;

        iz = matrix.iz;
        jz = matrix.jz;
        kz = matrix.kz;
    }

    Matrix3by3 (const float _ix, const float _jx, const float _kx,
                const float _iy, const float _jy, const float _ky,
                const float _iz, const float _jz, const float _kz) :
        ix(_ix), jx(_jx), kx(_kx),
        iy(_iy), jy(_jy), ky(_ky),
        iy(_iz), jx(_jz), kz(_kz) {}
    }; 
#endif

我得到错误(两次)

  

预期的说明符限定符列表   在'Matrix3by3'之前

在第一个构造函数的行上。我试图寻找答案,似乎它与编译器有关,不知道这是一种类型。所以我尝试了以下内容,为了简洁起见,我会删除内脏:

typedef struct Matrix3by3 { ... };

struct Matrix3by3 { struct Matrix3by3() {} ... };

struct Matrix3by3 { ... } Matrix3by3;

typdef struct Matrix3by3;
struct Matrix3by3 { ... };

我在针对此错误看到的博客和文章中提出了所有解决方案。我也看到它可能因为循环依赖而出现,但是这个文件没有包括任何其他东西,我甚至删除它们只是为了确定 - 不做任何改变。

我可以在Objective-c类中写这个,我敢肯定,但它可能需要更多的内存和周期,而这正是我想要避免的。我唯一能想到的是我默认设置的一些编译器/项目设置,这使我无法使用这种类型的结构。完全可能,因为我正在学习语言/环境。

任何人都可以提供一些帮助吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

C不支持结构体的构造函数或成员函数。您无法将其编译为C或Objective-C。您需要将其编译为C ++或Objective-C ++,此时它几乎会编译:您的第3个构造函数中有错误,因为您尝试初始化成员iyjx多次。一旦你修复了这些拼写错误,它就可以很好地编译。

答案 1 :(得分:1)

typedef struct { ... } Matrix3by3;

应该有效。它将匿名结构声明为类型。

使用class而不是struct:)

答案 2 :(得分:1)

您使用哪种语言/编译器翻译程序?我猜你正在尝试将代码编译为C,而你尝试使用的语言特性是严格遵循C ++的。

答案 3 :(得分:0)

错误“Matrix3by3之前的预期说明符 - 限定符列表”是GCC主义,这意味着令牌“Matrix3by3”未知。当您有一个编译器无法识别的类型时,通常会出现这种情况,原因是您输入错误或忘记了标题。在你的情况下,这是因为“Matrix3by3”类型确实不存在。您有两种选择:

  1. 直接停止使用Matrix3by3并开始使用struct Matrix3by3,因为这是您定义的实际类型。
  2. 为你的struct提供一个typedef。它看起来像

    typedef struct {
        // fields here
    } Matrix3by3