gpt4 book ai didi

c++ - 将函数定义为静态成员和自由成员之间有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:51 25 4
gpt4 key购买 nike

<分区>

考虑以下代码片段:

#include <iostream>

using namespace std;

struct Element {
void SetVisible(bool) { cout << "Called SetVisible on Element" << endl; }
};

struct ElementQuery {
ElementQuery(Element * e) : element(e) { }
Element * Get() const { return element; }
Element * element;
};

namespace A {

static void SetVisible(ElementQuery const& element, bool show) {
cout << "Called SetVisible on ElementQuery" << endl;
SetVisible(element.Get(), show);
}

static void SetVisible(Element * element, bool show) {
element->SetVisible(show);
}

};

int main() {
Element * e = new Element();
ElementQuery q(e);
A::SetVisible(q, true);
delete e;
return 0;
}

运行时,程序因调用 SetVisible(element.GetFirst(), show) 中的无限递归而失败。我认为这是因为函数 SetVisible(Element * element, bool show) 在调用时尚未声明,尽管它更适合重载解析。

但是当我将 namespace A 更改为 struct A 时,重新编译并运行,一切正常。程序向 cout 打印两行并优雅地结束。

我的问题是:为什么第二个调用“看到”了 SetVisible 的第二个声明,这些声明之间有什么区别?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com