2013-01-11 161 views
5

我試圖構建我的朋友的QT應用程序的OS X版本,他在Windows和Linux上構建了這個應用程序。我們都使用g ++。我正在使用gcc 4.2.1。不幸的是,我不知道他在構建應用程序時使用了什麼版本(很早以前)。非類型模板參數錯誤('x'不是類型)

任何人都可以揭示爲什麼我收到錯誤一些輕:

../../../src/dbapi/dbcore/node.h:24: error: 'dimensions' is not a type 

編譯下面的代碼時:

Node.h:

template<class T,const unsigned int dimensions> 
class EXPORT_DBCORE Node : public Transform<T,dimensions> 
{ 
public: 
    Node(Id id, 
     QString& name, 
     QString& text = "", 
     // ************** Offending line: *************** 
     Vector<T,dimensions> position = Vector<T,dimensions>(), 
     Quaternion<T> rotation = Quaternion<T>()) 
    : Transform<T,dimensions>(position, rotation) 
    , mId(id) 
    , mName(name) 
    , mText(text) 
    { 
    } 

private: 
    ... 
}; 

Vector.h:

template<class T,const unsigned int dimensions> 
class EXPORT_DBCORE Vector 
{ 
public: 
    //! Default Constructor 
    Vector() 
    { 
    mpArray = new T[dimensions]; 
    for(int i = 0; i < dimensions; i++) 
    { 
     mpArray[i] = 0; 
    } 
    } 
... 

謝謝。

編輯:對不起,如果不清楚哪一行是24號。它由Node.h摘錄中的「Offending line」註釋表示。

+1

你能否給我們提示代碼段中的哪一行是第24行? –

+7

你在'Node'頭文件中包含了'Vector'頭文件嗎?當Qt和標準庫都有良好的工作類時,爲什麼要使用自己的矢量類? –

+4

是gcc 4.2.1最新的編譯器嗎?也許如果你切換到最近版本的鏗鏘聲,它會工作,否則你會得到更好的錯誤信息。 – bames53

回答

3

不幸的是我認爲標準實際上說這個代碼是不合格的,請參閱core issue 325。 C++語法說默認參數的模板參數列表中的逗號被解析爲啓動下一個函數參數,所以問題出在代碼的= Vector<T, dimensions>()位,所以dimensions被視爲啓動一個新的函數參數,而不是模板標識的一部分。

GCC 4.4.0在近五年前發生了變化(請參閱Bug 57)以接受代碼,您是否有充分理由使用這樣的舊版本?

typedef Vector<T, dimensions> VectorType; 

然後使用:

如果不能升級,你可以通過添加一個typedef到節點解決該漏洞

Node(Id id, 
     QString& name, 
     QString& text = "", 
     VectorType position = VectorType(), 
     Quaternion<T> rotation = Quaternion<T>()) 

技術上只有默認的參數需要使用typedef,但我會用它作爲參數聲明和默認參數。事實上,我幾乎總是爲我的類使用的任何容器類型聲明一個typedef,然後在該類中使用該typedef。這通常更短,並且意味着如果更改容器,則通常只需更新typedef,而不是每次使用它。

+0

很好的解釋,謝謝。我正在使用MacPorts 2.7版本,問題已解決。 我正在使用4.2.1,因爲這是與Xcode捆綁在一起的。我想,無論Xcode帶來什麼,對於OS X開發來說都是最穩定的。 –

+1

不,Xcode的最新版本是作爲GPLv2許可的最後一個版本。由於許可原因,Apple不會推出新版本,而不是技術原因或穩定性原因。 –