<分区>
考虑以下代码片段:
#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
的第二个声明,这些声明之间有什么区别?