【问题标题】:Maximum number of function overloads?函数重载的最大数量?
【发布时间】:2012-01-12 21:14:03
【问题描述】:

在 C++ 中,可以相互重载的函数有最大数量吗?

我遇到了令人困惑的“无匹配功能”错误。我有一个重载的encode 函数,对于我正在编码的每个结构/值类型(包括数组/向量的模板),大约有 900 个不同的版本。编码函数根据需要编码的字段相互调用。

如果我将 encode(std::string) 函数放在文件(.h 和 .cpp)的底部,则对它的调用会返回“无匹配函数”。如果它靠近顶部,则它们不会。

发生了什么,更重要的是,我应该如何解决?

(linux gcc 版本 4.6.1)

【问题讨论】:

  • 你有 900 次重载?????? ?? ???我将从适当地对重载进行分组开始,通常大多数编译器都支持版本选项...阅读您的编译器手册..
  • 为什么你认为 900 次重载很多? stream operator << (stream, smtn_other) 的重载呢?
  • @Nim 嗯,这是一个插件,我正在用make install 为主程序编译它。这链接了主程序中的所有库,因此我可以在我的编码插件中引用它们。我认为它使用的是 gcc,版本为 4.6.1
  • @Lol4t0:我不确定operator<<() 有多少重载,但我无法说出超过 50 个。
  • 这完全符合 Raymond Chen 的台词“如果你不得不问,你可能做错了什么”。我会为实际有 1025 次重载付出代价。

标签: c++ function


【解决方案1】:

通过您根据放置函数的位置对出现和消失的错误的描述,这与重载的数量无关。相反,问题在于您试图在声明之前调用重载。

当您有一堆函数都像您描述的那样相互调用时(无论它们是重载还是具有不同的名称),您通常需要首先声明所有函数,然后在所有定义之后再定义它们被看到。通常你的结构是这样的,声明都在头文件中(所以其他文件并包含它),定义都在源文件中(包括头文件),所以这一切都很容易。如果您有内联函数(通常需要在头文件中定义以便在所有编译单元中内联),事情会变得更加复杂,但总体模式是相同的——首先声明所有内容,然后定义所有内容。

编辑

您究竟在哪里得到“不匹配的重载”错误? - 您需要在编码函数的声明之后移动包含获取该错误的调用的定义(或在有错误的定义之前移动编码声明)。只要 ALL DECLARATIONS 在 ALL DEFINITIONS 之前,排序就OK了。

【讨论】:

  • 我已将所有函数声明和模板放在源文件中的头文件和函数定义中,因此我认为这不适用于我的情况。当我说“文件底部的函数”时,我指的是将声明移动到标题的底部,将定义移动到源代码的底部。
  • 你是对的!我不知何故在考虑不需要单独定义的模板,因为它们在头文件中。我在标题的顶部给出了我所有的模板定义,并将它们的定义移到了底部,一切正常! :)
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多