2012-01-12 68 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