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

时间:2011-08-31 00:18:01

标签: c++ g++

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 ++在声明的内容和被调用的内容之间看到完全相同的签名,但仍然抱怨找不到匹配的函数。

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


我没有传递NULL指针并为了好玩而投射一个常量整数...原来我有

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

并得到了同样的错误。因此,我决定通过提供一些明确的论证来澄清g ++的内容。我可以向你保证,NULL指针不是问题 - 尽管可以理解的是,当看到与const传递NULL时,我们都有点畏缩:)

3 个答案:

答案 0 :(得分:5)

该函数需要非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填写一些有意义的值,所以一定要合适地加入。

答案 1 :(得分:3)

修改
更正以反映评论。

候选人具有完全相同的签名。该函数引用一个指向SomeClass的const指针,并提供一个指针。事实上,你提供了一个特别讨厌的函数指针。

这里的一个大问题是空指针。你需要为编译器提供一些可靠的东西,以便它可以参考它。你给它一个空指针。

答案 2 :(得分:2)

您的函数需要非const引用指针,而不是指针。你不能从文字(即空指针)创建一个非const引用,所以编译器无法调用第一个参数为'0'的函数,并且他寻找一个带有第一个参数的重载(指针) )通过复制。