问题引用 this ,这是早些时候发布的。
虽然 OP 很高兴接受解决了他的问题的答案,但我对编译器为何给出看似错误的错误的细节有点好奇。
下面是我创建的一个小代码示例来演示相同的内容:
class YourClass
{
};
class YourClass2
{
};
class MyClass
{
public:
void doSomething(YourClass2 obj)
{
//Nothing more Interesting to do
}
};
int main()
{
YourClass *ptr = new YourClass();
MyClass obj;
obj.doSomething(ptr);
return 0;
}
编译 this GCC(4.3.4) 给出了一个看似奇怪的错误结果:
prog.cpp: In function ‘int main()’:
prog.cpp:23: error: no matching function for call to ‘MyClass::doSomething(YourClass*&)’
prog.cpp:13: note: candidates are: void MyClass::doSomething(YourClass2)
所以问题是:
为什么编译器会处理这个调用,
obj.doSomething(ptr);
调用带有原型(prototype)的函数,
MyClass::doSomething(YourClass*&)
而不是
MyClass::doSomething(YourClass*)
这似乎是显而易见的情况。
最佳答案
首先,请注意表达式 ptr
(不是变量 ptr
)的类型是YourClass *&
。这个很重要;这是引用类型可以工作的唯一方式(否则当你执行 YourClass *&x = ptr
时你将引用一个copy,这也是为什么 YourClass *&x = (ptr + 1)
失败)。因此,编译器开始使用 MyClass::doSomething(YourClass *&)
搜索函数。
当然,这个调用可以匹配一个原型(prototype)MyClass::doSomething(YourClass *)
。它还可以匹配 MyClass::doSomething(const YourClass *)
或许多其他。可能有几十个(或者,有多个参数,很容易成百上千个)原型(prototype)可能匹配这个调用;然而,没有找到。
因此编译器放弃,并报错。在错误中,它列出了每一个理论上可能的匹配项,而是引用了与它最初寻找的内容最匹配的一个原型(prototype);即,MyClass::doSomething(YourClass *&)
。
关于c++ - 为什么编译器错误地检测不到正确的函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7111843/