c++:没有可调用的匹配函数,但候选函数具有完全相同的签名
c++: no matching function for call, but the candidate has the exact same signature
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'的函数,他会通过复制来寻找一个重载,接受它的第一个参数(指针)。
相关文章:
- 构造函数/函数声明参数列表中的统一初始化
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 如何区分宏函数和函数函数而没有任何歧义?
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- C++ 候选构造函数不可行:没有已知的转换
- bool值不在腔函数函数中重新调整false,c
- 用参数调用函数/函数,而不是参数
- 为什么在破坏函数函数中fstream Zero ernno
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 调用函数函数从功能指针向量向量的函数指针
- Main 不能调用函数:函数未在此范围内声明
- 如何调用传递的函数(函数 ptr 作为参数传递给函数)
- 构造函数:函数不接受3个参数
- 如何理解函数函数参数中的星号(*)?
- 错误:候选构造函数(隐式移动构造函数)不可行:没有已知的转换
- 指向函数/函数表的指针
- LNK2019:函数"函数"中'symbol'引用未解析的外部符号;致命错误 LNK1120:1 未解析的外部
- c++:初始化没有匹配的构造函数/候选构造函数不可行:需要单个参数,但没有提供参数