C ++错误消息“<near match =”“>”是什么意思?</near>

时间:2009-10-07 10:26:47

标签: c++ templates compilation

使用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>

<near match> 表示什么以及如何解决此错误?

(我在没有(希望)删除必要信息的情况下尽可能地简化了错误消息。实际上,我不想在这里提出一个明确的例子,但鼓励对这个问题的一般回复!)

3 个答案:

答案 0 :(得分:14)

除了<near match>之外,当可能的方法匹配时,我通常会看到const。在这种情况下,字符串可能是可选参数吗?在这种情况下,问题是你有一个const对象,并试图调用非const方法。

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

编辑:

从你的评论中,最后的字符串是可选的,所以不是问题。假设这是你想要调用的方法,那么问题是你有一个const指针/对象的引用,并试图调用非const方法。要解决这个问题,请:

  • 制作方法const,如果它不修改对象的可见状态
  • 或传递非const引用/指针

如果这些选项都不可能,并且作为最后的手段并且你不能改变这些东西,你可以const_cast指针/参考,但是你会留下一个非常难闻的气味代码。

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

答案 1 :(得分:4)

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

编译器列出了在此重载决策中考虑的所有重载,以便您可以检查实际想要调用的那个实际存在(如果没有,您错过了包含头,包含限定等...)< / p>

<near match>表示这是(根据编译器)你实际想要调用的可能重载,因为根据标准(const-ness,可能的转换,...​​...),它是最好的重载

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

答案 2 :(得分:0)

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