C++错误消息"<near match>"是什么意思?

fue*_*zig 3 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Dou*_*der 14

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

注意:我没有看过编译器代码,只看了gcc生成的错误消息.

编辑:

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

  • const如果方法没有修改对象的可见状态,请创建该方法
  • 或者传递非const引用/指针

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

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

  • 请不要做const_cast - 这意味着你的代码被破坏了,你正在解决这个问题.方法应该是const,或者对象指针/引用不应该是const. (2认同)

Mat*_* M. 5

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

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

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

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