1

C++ で単純な STL マップを実装しました。私が指示されたようにタイプとして比較を除外し、次に示すように比較を実装しました。

template <typename T> int KeyCompare<T>::operator () (T tKey1, T tKey2)
{

        if(tKey1 < tKey2)
        return -1;
    else if(tKey1 > tKey2)
        return 1;
    else 
        return 0;
} 

ここでは、tKey1 と tKet2 が比較対象の 2 つのキーです。これは、すべての基本的なデータ型と文字列でうまく機能しました。Testという名前のユーザー定義型のキーを比較するためのテンプレートの特殊化を追加し、次のように特殊化を追加しました。

int KeyCompare<Test>::operator () (Test tKey1, Test tKey2)
{

        if(tKey1.a < tKey2.a)
        return -1;
    else if(tKey1.a > tKey2.a)
        return 1;
    else 
        return 0;
}

これを実行すると、リンクエラーが表示されます

SimpleMap.obj : エラー LNK2005: "public: int __thiscall KeyCompare::operator()(class Test,class Test)" (??R?$KeyCompare@VTest@@@@QAEHVTest@@0@Z) は MapTest で既に定義されています.obj

SimpleMap.obj : エラー LNK2005: "public: __thiscall KeyCompare::~KeyCompare(void)" (??1?$KeyCompare@VTest@@@@QAE@XZ) は MapTest.obj で既に定義されています

SimpleMap.obj : エラー LNK2005: "public: __thiscall KeyCompare::KeyCompare(void)" (??0?$KeyCompare@VTester@@@@QAE@XZ) は MapTest.obj で既に定義されています

MapTest.cpp は、テスト ケースを記述したテスト ハーネス クラスです。複数のインクルードを停止するために、インクルード ガードも使用しました。

何が問題なのか分かりますか??

どうもありがとうございました!!

4

2 に答える 2

2

それは専門分野ではありません。

また、コード全体を表示してください。メソッドをテンプレート化したようですoperator ()。これはかなり非正統的です。代わりに、クラス全体をテンプレート化し、適切に特化してください。

したがって、コードの代わりに、次のように記述します。

template <typename T>
struct KeyCompare {
    int operator ()(T const& key1, T const& key2) const {
        // Comparison logic here …
    }
};

次に、クラスを特化します。

template <>
struct KeyCompare<Test> {
    int operator()(Test const& key1, Test const& key2) const { … }
};

これは少しコードが増えますが、真に拡張可能になります (既存のコードを変更することなく、誰でも独自の特殊化実装を追加できるため)。これは、他の C++ ライブラリ (特に STL) の動作方法でもあります。

于 2010-05-31T09:13:37.343 に答える
0

特殊化は必要ありません-単純にオーバーロードします:

int KeyCompare::operator () (Test tKey1, Test tKey2)
{

        if(tKey1.a < tKey2.a)
        return -1;
    else if(tKey1.a > tKey2.a)
        return 1;
    else 
        return 0;
}

そして、これらすべての比較関数にパラメーターを const 参照として渡す必要があります。

于 2010-05-31T09:12:19.110 に答える