5

私は友人のQTアプリケーションのOSXバージョンを構築しようとしています。これは彼がWindowsとLinuxで構築したものです。どちらもg++を使用しています。私はgcc4.2.1を使用しています。残念ながら、彼がアプリケーションをビルドしたときに使用したバージョンはわかりません(かなり前のことです)。

誰かが私がエラーを受け取っている理由に光を当てることができますか?

../../../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の抜粋の「問題のある行」コメントで示されています。

4

1 に答える 1

4

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

GCC 4.4.0は、コードを受け入れるように5年近く前に変更されました(バグ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を更新するだけでよく、すべての使用ではありません。

于 2013-01-13T19:11:01.630 に答える