2013-01-11 17 views
5

WindowsとLinuxで構築した友人のQTアプリケーションのOS X版をビルドしようとしています。我々はどちらも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; 
    } 
    } 
... 

ありがとう。

EDIT:No行24の行が不明な場合は申し訳ありません。Node.hの抜粋の "Offending line"コメントで示されています。

+1

コードスニペットのどの行が24行目であるかのヒントを教えてください。 –

+7

'Node'ヘッダファイルに' Vector'ヘッダファイルを含めましたか?なぜQtと標準ライブラリの両方が良い作業クラスを持っているのでしょうか? –

+4

gcc 4.2.1は最新のコンパイラですか?たぶん最近のバージョンのclangに切り替えるとうまくいくか、より良いエラーメッセージが出るでしょう。 – bames53

答えて

3

残念ながら、標準では、実際にこのコードが不正であると言います。core issue 325を参照してください。 C++文法では、デフォルト引数のテンプレート引数リストのコンマが次の関数引数を開始するものとして解析されるので、問題はコードの= Vector<T, dimensions>()ビットにあるので、dimensionsは新しい関数パラメータとしてではなくテンプレートIDの一部。

約5年前にGCC 4.4.0が変更されました(Bug 57参照)。このコードを受け入れるには、古いリリースを使用するのに十分な理由はありますか?

アップグレードできない場合は、ノードへのtypedefを追加することによって、バグを回避することができます

typedef Vector<T, dimensions> VectorType; 

を次にこれを使用して:

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

技術的には、デフォルトの引数を使用する必要がありますtypedefですが、パラメータの宣言とデフォルトの引数に使用します。実際には、ほとんどの場合、クラスが使用するコンテナ型のtypedefを宣言してから、そのクラスのtypedefを使用します。これはしばしば短縮され、コンテナを変更した場合、typedefを更新する必要があるだけで、たいていはそれを使用する必要はありません。

+0

すばらしい説明、ありがとう。私はMacPorts 2.7ビルドを使用しており、問題は解決されました。 Xcodeにバンドルされているので、私は4.2.1を使用していました。私は、Xcodeに付属しているものは、OS X開発にとって最も安定していると考えました。 –

+1

いいえ、Xcodeに付属しているものは、GPLv2としてライセンスされた最後のバージョンです。アップルはライセンス理由のために新しいバージョンを出荷するのではなく、技術的理由や安定性の理由で出荷することはありません。 –

関連する問題