2010-12-07 210 views
1

”之前的预期说明符限定符列表错误“我正在尝试编写一些代码来优化我正在编写的程序的某些Open GL函数,不幸的是,我不完全是C或C++老手,但这就是我为什么要做这个项目的一部分!错误“结构构造函数

所以我创建一个结构来处理3×3的矩阵,我定义结构如下:

#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 

而我得到的错误(两次)

预期说明符qualifier-列表 之前'Matrix3by3'

在第一个构造函数的行上。我试图四处寻找答案,似乎它不知道这是一种类型的编译器。所以,我曾尝试以下,我会去掉内脏为简洁:

typedef struct Matrix3by3 { ... }; 

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

struct Matrix3by3 { ... } Matrix3by3; 

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

哪些是被认为博客上的所有解决方案和我看到这个错误的文章。我也看到它可能是由于循环依赖引起的,但是这个文件没有包含任何其他内容,并且我甚至删除了它们,只是为了不时确定 - 没有变化。

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

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

谢谢!

回答

4

C不支持结构的构造函数和成员函数。你无法将它编译为C或Objective-C。您需要将其编译为C++或Objective-C++,此时它几乎可以编译:您的第三个构造函数中有一个错误,因为您试图多次初始化成员iyjx。一旦你解决了这些错别字,它编译得很好。

+0

啊,是的,我看到了这些错误。当我把这件事抛出去的时候,已经有一段时间了。事情是,当我看到iPhone开发的例子时,我在其他多个地方看到过这种类型的东西。所以我不确定它为什么在那里工作(甚至在直接下载的例子中),但不适合我。我认为这是xcode中的一些编译器/项目设置,但我不确定是什么。或者我错过了分号错误的结构等效 – Kevek 2010-12-07 12:57:22

1
typedef struct { ... } Matrix3by3; 

应该工作。它将匿名结构声明为一种类型。

而使用类而不是结构:)

+0

在这种情况下,我得到了同样的错误,这是我尝试过的一个错误,以前我也相信。我认为这是因为当C/C++编译器到达“Matrix3by3(){}”构造函数时,它不知道Matrix3by3是一种类型?尽管如此,我已经在其他示例代码中看到了这一点,我很困惑它为什么可以在其中工作,而不是当我尝试模拟结构时,就像我刚才所说的我是新来的直接来自C不同的背景。你有其他想法吗? – Kevek 2010-12-07 13:01:48

0

错误“之前‘Matrix3by3’预计符限定符列表”是GCC主义,这意味着令牌“Matrix3by3”是未知的。当你有一种编译器无法识别的类型时,通常就是这种情况,要么是因为错误输入了类型,要么是因为您忘记了标题。就你而言,这是因为类型“Matrix3by3”确实不存在。你有两个选择:

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

    typedef struct { 
        // fields here 
    } Matrix3by3 
    
+0

如果我把“struct Matrix3by3(){}”作为构造函数行(并且在其他两个前面),我得到错误“Expected identifier or'('before')'token”看起来像它理解的甚至更少。我感觉我要么将Objective-C设置为没有需要的C++,要么我只是做一些明显的语法错误。 – Kevek 2010-12-07 13:04:18

+0

从查看其他答案以及重新阅读您的问题,看来这里的底层问题是您正在编写C++并尝试将其作为C运行。 – 2010-12-08 00:50:27

1

你用什么语言/编译器翻译你的程序?我猜你正在尝试将代码编译为C,而您尝试使用的语言功能严格限于C++。