c++ - 为什么编译器错误地检测不到正确的函数签名?

标签 c++ function gcc

问题引用 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/

相关文章:

c++ - 是否可以从指针模板参数中提取类型?

c++ - 函数中的 std::end 和 std::begin (C++)

c++ - 为什么 C++ 链接器在构建期间需要库文件,即使我是动态链接的?

c - gcc c 编译错误

ios - swift 错误 : Cannot pass immutable value as inout argument: 'pChData' is a 'let' constant

C++类实例数组初始化

c++ - 如何清除 vector 但保持其容量?

c++ - 将 vector 作为值分配给 std::unordered_map 中的键

c++ - 使用SFML绘制多个形状

function - 试图将 col.name 附加到向量上