c++:没有可调用的匹配函数,但候选函数具有完全相同的签名

c++: no matching function for call, but the candidate has the exact same signature

本文关键字:候选函数 函数 调用 c++      更新时间:2023-10-16

g++抱怨

myclass.cxx:185: error: no matching function for call to 'IMyInterface::doSomething(const SomeClass*, unsigned int)'
IMyInterface.h:34: note: candidates are: virtual void IMyInterface::doSomething(const SomeClass*&, unsigned int)

当我调用

m_instanceOfInterface->doSomething((const SomeClass*)0,(unsigned int)1);

为什么?在我看来,g++在声明的内容和调用的内容之间看到了完全相同的签名,但仍然抱怨没有找到匹配的函数。

我可以在相同的上下文中调用IMyInteface的另一个函数IMyInterface::doSomethingElse(float& p)。所以const是问题所在?


我没有传递NULL指针和转换一个常量整数只是为了好玩…原来我有

m_instanceOfInterface->doSomething((const SomeClass*)m_someDerivedClass,m_anInteger);

并得到相同的错误。因此,我决定通过给出一些明确的参数来阐明g++。我可以向您保证,NULL指针不是问题-尽管可以理解的是,当看到NULL通过const传递时,我们都有点畏缩:)

该函数要求其实参为非const引用,不能绑定到临时类型。观察:

void foo(int, T &);
foo(1, T()); // error, cannot bind to temporary

在您的情况下,T = SomeClass const *。因此,您提供了一个非临时的:

SomeClass const * pc = 0;
m_instanceOfInterface->doSomething(pc, 1U);

请注意,这样做的目的大概是用一些有意义的值填充pc,所以一定要适当地合并。

编辑
更正以反映注释。

候选不是具有完全相同的签名。该函数接受一个指向SomeClass的const指针的引用,而您提供的是一个指针。实际上,你提供了一个特别讨厌的指向函数的指针。

这里的一个大问题是空指针。你需要给编译器一些可靠的东西,这样它才能接受它的引用。你给它一个空指针

你的函数需要一个指向指针的非const引用,而不是指针。你不能从字面量(即空指针)创建一个非const引用,所以编译器无法调用第一个参数为'0'的函数,他会通过复制来寻找一个重载,接受它的第一个参数(指针)。