2012-01-12 65 views
2

在C++中是否有可以相互重載的最大數量的函數?函數重載的最大數量?

我越來越困惑「沒有匹配的功能」錯誤。我有一個超載的encode函數,其中包含我編碼的每個結構/值類型(包括數組/矢量模板)的約900個不同版本。編碼函數根據哪些字段需要編碼來相互調用。

如果我將encode(std::string)函數放在文件底部(.h & .cpp),則對其的調用返回「無匹配函數」。如果它靠近頂部,那麼它們不會。

發生了什麼事情,更重要的是,我該如何解決這個問題?

(linux的gcc版本4.6.1)

+0

900重載?! – ronag 2012-01-12 21:25:11

+6

你有900重載?????? ?? ?????我會先適當地分組重載,通常大多數編譯器都支持一個版本選項...閱讀你的編譯器手冊.. – Nim 2012-01-12 21:25:13

+0

爲什麼你認爲900重載是很多? '流運算符<<(stream,smtn_other)'的重載是什麼? – Lol4t0 2012-01-12 21:30:05

回答

3

通過你的錯誤出現,並根據你把功能消失的描述,這已經無關重載的數量。相反,問題在於你試圖在聲明它之前調用一個超載。

當你有一大堆函數都像你描述的那樣相互調用的時候(不管它們是重載還是有不同的名字),你通常需要首先DECLARE所有函數,然後在所有定義之後定義它們已被看到。通常情況下,你的結構是這樣的,所以聲明都在一個頭文件(所以其他文件和包含它)和定義都在一個源文件(其中包括頭),所以這一切都很容易。如果你有內聯函數(通常需要在頭文件中定義所有編譯單元中的內聯函數),事情會變得更加複雜,但整體模式是相同的 - 首先DECLARE所有內容,然後定義所有內容。

編輯

哪兒你得到了「不匹配超載」的錯誤? - 您需要移動含有在編碼函數聲明之後出現該錯誤的調用的DEFINITION(或者在DEFINITION之前移動編碼聲明並顯示錯誤)。只要ALL DECLARATIONS在ALL DEFINITIONS之前,訂購就可以了。

+0

我已經將所有函數聲明和模板放在源文件中的頭文件和函數定義中,所以我不認爲這適用於我的情況。當我說「在文件底部的函數」時,我指的是將聲明移動到頭部的底部,並將定義移動到源代碼的底部。 – Annan 2012-01-12 22:18:41

+0

你是對的!我以某種方式考慮了不需要單獨定義的模板,因爲它們在頭文件中。我將所有模板定義放在標題的頂部,並將其定義移至底部,一切正常! :) – Annan 2012-01-13 02:45:45