使用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>
表示什么以及如何解决此错误?
(我在没有(希望)删除必要信息的情况下尽可能地简化了错误消息。实际上,我不想在这里提出一个明确的例子,但鼓励对这个问题的一般回复!)
答案 0 :(得分:14)
除了<near match>
之外,当可能的方法匹配时,我通常会看到const
。在这种情况下,字符串可能是可选参数吗?在这种情况下,问题是你有一个const对象,并试图调用非const方法。
注意:我从未查看过编译器代码,只看了gcc生成的错误消息。
编辑:
从你的评论中,最后的字符串是可选的,所以不是问题。假设这是你想要调用的方法,那么问题是你有一个const指针/对象的引用,并试图调用非const方法。要解决这个问题,请:
const
,如果它不修改对象的可见状态如果这些选项都不可能,并且作为最后的手段并且你不能改变这些东西,你可以const_cast
指针/参考,但是你会留下一个非常难闻的气味代码。
我们的代码中有一些地方const_cast
,但只有在调用旧的C函数时才会使用非常量指针但不修改它。在您控制的直接C ++代码中,您可以避免使用const_cast
。
答案 1 :(得分:4)
这是重载解析过程的一部分。
编译器列出了在此重载决策中考虑的所有重载,以便您可以检查实际想要调用的那个实际存在(如果没有,您错过了包含头,包含限定等...)< / p>
<near match>
表示这是(根据编译器)你实际想要调用的可能重载,因为根据标准(const-ness,可能的转换,......),它是最好的重载
换句话说,它表明在所考虑的所有重载中,您可能想要调用它并且应该检查您的参数是否与签名实际匹配。
答案 2 :(得分:0)
这很可能意味着,在调用站点和函数声明中类型之间存在不匹配。特别是,这意味着你可能在一侧或另一侧有一个“const”太多或太少。错误消息为您提供了不匹配的声明/调用的行号。