【问题标题】:What does the C++ error message "<near match>" mean?C++ 错误消息“<near match>”是什么意思?
【发布时间】:2009-10-07 10:26:47
【问题描述】:

当使用 GNU C++ 编译器编译我的代码时,我会得到类似的东西

bla.cxx: In function `int main(int, const char**)':
bla.cxx:110: error: no matching function for call to `func(const classA*&, const classB<classC>*&) const'
someheader.h:321: note: candidates are: bool func(const classA*, const T*&, const std::string&, std::string&) [with T = classB<classC>] <near match>

&lt;near match&gt; 表示什么以及如何解决此错误?

(我在没有(希望)删除必要信息的情况下尽可能简化了错误消息。实际上,我宁愿不在这里举一个明确的例子,而是鼓励对这个问题做出一般性的回答!)

【问题讨论】:

  • 为了将来的参考,最好有产生消息的实际代码行(如果可能的话,一个完整的 sn-p,即使有点剥离)。在这里,我们可以回答您的实际问题,但我们不能做得更好,比如更准确地为您指明正确的方向。
  • 我没有将导致错误的代码行放在这里有两个原因:1)它本身没有帮助(看起来像 getFeature(te, a) :) 2)我无法添加一个 sn-p,因为有问题的行是一个非常复杂的软件框架的一部分,这使得在不改变整体行为的情况下很难从那里提取它。
  • 他们是。特别是因为问题本身不依赖于明确的例子。它只是询问编译器在其重载决议建议中添加“”的情况。我认为这个例子只会分散读者对我最初想知道的内容的注意力。

标签: c++ templates compilation


【解决方案1】:

当可能的方法匹配时,我通常会看到 &lt;near match&gt;const 除外。在这种情况下,字符串可能是可选参数?在这种情况下,问题是您有一个 const 对象,并且正在尝试调用一个非常量方法。

注意:我从未查看过编译器代码,只是查看了 gcc 生成的错误消息。

编辑:

根据您的评论,最后的字符串是可选的,所以不是问题。假设这是您要调用的方法,那么问题是您有一个对该对象的 const 指针/引用,并且正试图调用一个非常量方法。要解决此问题,可以:

  • 创建方法const,如果它不修改对象的可见状态
  • 或者传递一个非常量引用/指针

如果这两个选项都不可能,并且作为最后的手段,并且您无法更改其中任何一个,您可以const_cast 指针/引用,但是您会在代码中留下非常难闻的气味.

在我们的代码中确实有一些地方可以使用const_casts,但只有在调用旧的 C 函数时才会使用非常量指针但不修改它。在您控制的直接 C++ 代码中,您可以避免使用const_cast

【讨论】:

  • 我也尝试添加两个字符串,但没有帮助。最后两个参数(字符串)是可选的。
  • 那么你有一个 const 对象并试图调用一个非 const 方法。
  • 是的,结果证明这是解决方案。我必须做一个 const_cast。
  • 请不要执行 const_cast - 这意味着您的代码已损坏并且您正在解决问题。方法应该是 const,或者对象指针/引用不应该是 const。
  • 是的,我知道这很糟糕——但我无法更改大部分代码。 (我需要使用一个非常量的方法,并且给我一个指向对象的指针的唯一方法给了我一个 const 指针。)
【解决方案2】:

这是重载解决过程的一部分。

编译器列出了在此重载解决方案中考虑的所有重载,以便您可以检查您实际想要调用的重载是否确实存在(如果没有,您错过了标头包含、限定等...)

&lt;near match&gt; 表示这是(根据编译器)您实际想要调用的可能重载,因为根据标准(常量、可能的转换......)它是最佳重载

换句话说,这表明在考虑的所有重载中,您可能想要调用它并且应该检查您的参数是否与签名真正匹配。

【讨论】:

    【解决方案3】:

    这很可能意味着调用站点和函数声明处的类型 之间存在不匹配。特别是,这意味着您可能在一侧或另一侧有一个“const”太多或太少。错误消息为您提供了不匹配的声明/调用的行号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多