1

次のコード スニペットを検討してください。

#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 Astruct A、再コンパイルして実行すると、すべて正常に動作します。プログラムは 2 行を出力しcoutて正常に終了します。

私の質問は: 2 番目の呼び出しが 2 番目の宣言を「見る」のはなぜSetVisibleですか?また、そのような宣言の違いは何ですか?

4

2 に答える 2

0

このコードはまったくコンパイルすべきではないようです。この呼び出しのため: SetVisible(element.Get(), show); $void SetVisible(Element * element, bool show) は、瞬間呼び出しでは表示されません。$void SetVisible(ElementQuery const& element, bool show) の前にこの関数を移動する必要があります。

于 2012-06-28T09:44:27.373 に答える