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指针不是问题 - 尽管可以理解的是,当看到与const
传递NULL时,我们都有点畏缩:)
答案 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'的函数,并且他寻找一个带有第一个参数的重载(指针) )通过复制。