0

(この質問は、ショットを撮ることをいとわない人にとっては報奨金があります)

こんにちは、コンテナクラスを引数としてオーバーロードテンプレート関数を定義しました

(ここでは CntrlCls1 = RWTValOrderedVectorおよび CntrlCls2 = RWTPtrSortedVector )

template<Class X> void func(CntrCls1<X>* ){}

template<Class X> void func(CntrCls1<X*>* ){}

template<Class X> void func(CntrCls2<X>*){}

定義した後、次のように関数を呼び出しています

func(&ABC);

ここで、ABC はCntrCls1<*>型のインスタンスです(つまり、ポインターのコンテナーです)。

現在、これは私のコンピューターでは正常にコンパイルされていますが、別のシステムでコンパイルすると、何らかの理由でコンパイラーが CntrlCls2 パラメーターを使用して関数テンプレートをインスタンス化しようとし、その結果、エラーが発生します。

CtrCls1 と CtrCls2 は無関係のコンテナーです。

更新: VS 2008 を使用して両方のシステムを構築しているので、問題にはなりません。

Update1: CtrCls2 パラメーターを使用して関数テンプレートをコメントアウトした後、再コンパイルしようとしましたが、コンパイルは最初の関数をインスタンス化しようとしています (つまり、ポインターなしで) :-(

4

1 に答える 1

0

1) インストールされている VS 2008 の Service Pack を確認します。コンパイラのバージョンはマシンによって異なり、結果が異なる場合があります。

2) テンプレート宣言で「class」の代わりに「typename」キーワードを使用してみてください。

ところで。コードから、ソートされたコンテナーの値にポインターを使用していることがわかります。ソートされたコンテナは、次のような比較を見つけることを期待しています

template<T> bool operator<(const T&left, const T&right);

RWTValOrderedVector と RWTPtrSortedVector は、並べ替えられた順序で値を含むコンテナーのように見えるため、このような比較演算子を使用する必要があります。ただし、ポインター型の operator< function は、それらが指すオブジェクトではなく、それらのアドレスを比較します。したがって、ポインタを順序付けられたコンテナに格納すると、ソートされたオブジェクトへのポインタのセットではなく、ソートされたポインタ セットが得られます。参考までに。

于 2011-02-12T09:11:49.097 に答える