iPhone SDK 3.2のテンプレートコンパイルエラー
-
04-10-2019 - |
質問
私はWindowsからいくつかのテンプレートコードを移植していますが、iPhone 3.2 SDKのコンパイラの違いにヒットしています。
クラステンプレートのメンバー関数内の元のコードは次のとおりです。
return BinarySearch<uint32, CSimpleKey<T> >(key);
BinarySearchは、別のテンプレートから継承された方法です。
これにより、次のエラーが生成されます。
csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'
Visual Studioコンパイラはテンプレートの階層を順調に進めているようですが、GCCは関数がどこから来たのかを完全に認定する必要があります(テンプレートメンバー変数で同じ問題をそのように修正することでこれを検証しました)。
だから私は今、これを次のように変更する必要があります
return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);
これで、次のエラーが生成されます。
csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token
頭を傷つけた後、ここで起こっていることは、BinarySearchの前に「<」を「より少ない」オペレーターとして解決しようとしているということです。
2つの質問: - エラーの解釈で正しい道を歩んでいますか? - どうすれば修正できますか?
-d
解決
もしも CSimpleTable
基本クラスです。その基本クラス名で、または this
. 。しかし、これらは両方ともテンプレートパラメーターに依存するため、コンパイラは名前を検索できません BinarySearch
意味。それはあなたが他の何かと比較する静的整数定数である可能性があります、またはそれはあなたが囲まれた引数を置くテンプレートである可能性があります <...>
にとって。コンパイラに後者について話す必要があります
/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);
または this
return this->template BinarySearch<uint32, CSimpleKey<T> >(key);
資格の理由は、コンパイラがテンプレートパラメーターに依存する基本クラスで資格のない名前を探していないためです(あなたの場合、パラメーターは T
)、名前のバインディングは、基本クラスにそのような名前があるかどうかに依存するため、これは不幸であると見なされます。のような平易な名前のために BinarySearch
, さらに、この名前がテンプレートパラメーターに依存することを示すことはありません。したがって、標準では、コンパイラがインスタンス化まで名前の検索を遅らせないように要求します。したがって、依存したベースでの検索がインスタンス化(そうではない)で許可されている場合でも、とにかく名前が許可されていても、とにかく見つかりませんでした。
コンパイラに、資格を取得することにより、囲いのクラスを囲むクラスを見るように明示的に指示する必要があります。この場合、コンパイラには、インスタンス化時に検索中に依存ベースクラスが含まれます。プレフィックス this
または、クラス名も名前を作成します 依存, 、したがって、インスタンス化までそれの検索を遅らせます。これらの2つの事実は、それが機能するために必要です。
他のヒント
たぶんそれはただの問題です uint32
typedef。新しい環境では利用できない可能性があります。最初のケースでは、名前空間解像度がNengine :: Uint32を選択します。2番目のケースでは、まったく何も選択しません(したがって、解析誤差)。
UINT32がWindowsでどのように定義されているかを探すことをお勧めし、その定義をコピーしてみてください。
おそらく、それはあなたがあなたの間隔を一貫していなかったからでしょう。あなたはやった CSimpleTable<CSimpleKey<T> >
, 、 それよりも CSimpleTable<CSimpleKey<T>>
. 。どちらも有効であるべきだと思いますが、おそらくパーサーのバグが関係していると思います。
編集:自動引数タイプの控除ルートを下って、明示的な専門化を刻むこともできます。