2011-04-18 70 views
0

我有一個任務:在模板類中使用非模板函數

要實現模板向量類(讓我們將其命名爲myvector)。我需要在我的項目中的多個文件中使用這個類,因此我將它的聲明放在「myvector.h」文件中,並將實現放入「myvector.hpp」文件中,然後在「myvector」中包含「myvector.hpp」。 h「後的所有聲明(如描述there)。但是,我在「myvector.hpp」中有一個非模板函數。所以當我在主文件中包含「myvector.h」文件時,一切正常。但是,當我包括另一個文件(「bignum.cpp」)「myvector.h」,我得到一個鏈接錯誤:

error LNK2005: "unsigned int __cdecl gerasimov_dmitry::calculate_capacity(unsigned int)" ([email protected][email protected]@[email protected]) already defined in bignum.obj 

我明白了原因 - 「bignum.h」代碼獲取既包括主.cpp和bignum.cpp文件中,因此編譯器不知道使用哪一個「calculate_capacity」函數。所以,我的問題是如何解決這種情況。

回答

4

您必須聲明函數inline(或者將定義移動到單個翻譯單元)。

,你所面臨的問題是,如果你定義在頭的功能,包括在多個翻譯單元標題,編譯器會在生成函數的所有翻譯單元。

當鏈接器試圖生成程序(或庫)時,它發現函數多次定義了並且抱怨它,因爲這違反了ODR(一個定義規則)。通過將函數標記爲inline,編譯器將標記該函數,以便當鏈接器看到多個定義而不是窒息時,它將放棄除定義之外的所有定義。

+0

謝謝。內聯工作正常。我試圖將定義移到單個翻譯單元,但我認爲我做錯了:) – karlicoss 2011-04-18 20:13:51