2010-12-07 194 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++。