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是兩個鍵,我比較。這適用於所有基本數據類型和字符串。我添加了一個模板特殊化比較命名用戶定義類型測試的鑰匙,並增加了專業化如下:

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:error LNK2005:「public:__thiscall KeyCompare ::〜KeyCompare(vo id)「(?? 1?$ KeyCompare @ VTest @@@@ QAE @ XZ)已經在MapTest.obj中定義了

SimpleMap.obj:error LNK2005:」public:__thiscall KeyCompare :: KeyCompare(void)「已經在MapTest.obj中定義了0 0 $ KeyCompare @ VTester @@@@ QAE @ XZ

MapTest.cpp是我編寫測試用例的測試用具類。我也使用了包括守衛,以阻止多個包含。

任何想法是什麼事?

非常感謝!

+0

忘記提及,在類Test中,**'a'是我用來比較對象的整數**值。 – Izza 2010-05-31 09:13:49

回答

2

這不是專業化。

此外,請顯示整個代碼。您似乎對模板化方法進行了模板化。這是非正統的。相反,對整個班級進行模式化,並將其專門化。

因此,而不是你的代碼,寫的是這樣的:

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)的工作方式。

+0

是的,我專門研究整個班級。我沒有在這裏發佈所有的代碼,但是類本身只做對象的比較,因此它只有構造函數以外的這個operator()方法。 – Izza 2010-05-31 09:17:02

+0

@isurulucky:不,你沒有專門研究整個班級 - 至少不是根據你發佈的代碼。如果該代碼與實際代碼不同,那麼您如何期望我們找到* real *錯誤,而不是簡化代碼中的錯誤? – 2010-05-31 09:33:59

+0

非常感謝。我試過你說的話,它似乎工作:)但你能解釋一下這裏發生了什麼嗎?當我像我一樣使用模板專業化時,會出現什麼問題?我模板全班,但 保持聲明和定義在兩個地方。但是當我使用你的方法時,沒有鏈接器錯誤。 – Izza 2010-05-31 09:34:28

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; 
} 

,你應該傳遞參數T所有這些比較功能爲const引用。

+0

如何在不修改類的情況下重載成員函數?我認爲這種方法不太合理...... – 2010-05-31 09:14:11

+0

@Konrad誰說你不能修改這個類? – 2010-05-31 09:16:51

+0

@尼爾·巴特沃斯:我說你*不應該*。使您的設計可擴展,不可修改。 ;-) – 2010-05-31 09:17:35