次のコード スニペットを検討してください。
#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;
}
実行すると、 call の無限再帰によりプログラムが失敗しますSetVisible(element.GetFirst(), show)
。オーバーロードの解決により適していますが、呼び出し時に関数SetVisible(Element * element, bool show)
がまだ宣言されていないためです。
しかし、に変更namespace A
しstruct A
、再コンパイルして実行すると、すべて正常に動作します。プログラムは 2 行を出力しcout
て正常に終了します。
私の質問は: 2 番目の呼び出しが 2 番目の宣言を「見る」のはなぜSetVisible
ですか?また、そのような宣言の違いは何ですか?