3

do_run の解決について標準を調べてみたところ、「非修飾名ルックアップ (3.4.1) または修飾名ルックアップ (3.4.3) を使用したルックアップの部分では、テンプレート定義コンテキストからの関数宣言のみが見つかりました。 "。コンテキストとは正確には何ですか?

次の例では、do_run(int)何らかの形で を「隠し」do_run(domain::mystruct)、コンパイラはo can't be converted to int. をコメントアウトするdo_run(int)と、do_run(domain::mystruct)に表示されrun、コードがコンパイルされます。この動作は、標準で言及されている「コンテキスト」に関連していますか? 私には両方do_run(int)do_run(domain::mystruct)ように見え、(解決可能な)実行に見えるはずです。

namespace domain {
    struct mystruct { };
}

void do_run(domain::mystruct) { cout << "do_run(domain::mystruct)" << endl; } 

namespace lib { namespace details {

    template <class T>
    class runner { 
    public:
        void run(T t) { do_run(t); }
    };

    void do_run(int) { cout << "do_run(int)" << endl; } 
}}

int main() {
    domain::mystruct o;
    lib::details::runner<domain::mystruct> r;
    r.run(o);
    return 0;
}

が存在する場合、「コンテキスト」do_run(int)に持ち込むための追加の手順が必要です。do_run(domain::mystruct)次の 3 つの方法があります。

  1. do_run(domain::mystruct)名前空間ドメインに入れます。
  2. do_run(domain::mystruct)名前空間 lib::detailsに入れます。
  3. using ::do_run名前空間 lib::details 内に追加します。

したがって、コンテキストは名前空間 lib::details と名前空間ドメインであると推測しましたか?

コンパイラ VS2010

4

1 に答える 1

1

検索は、依存名であるかどうかによって異なります。T関数呼び出しは(この型のオブジェクトを使用して呼び出されることにより)テンプレート引数の型にt依存するため、従属名です。

非依存の名前は、テンプレートが定義されているコンテキストで検索されます。実際のインスタンス化に関連するものは考慮されません。名前はテンプレート引数に依存しないと判断されるため、インスタンス化を考慮しても意味がありません。これはフェーズ I ルックアップです。

依存関数名は、インスタンス化を考慮して検索されます。これは、すべての引数を使用し、関連付けられた名前空間を決定して、これらの関連付けられた名前空間でのみ関数を検索します。組み込み型の場合、追加された関連付けられた名前空間はグローバル名前空間です。他のタイプの場合、追加される関連付けられた名前空間は、それらが存在する名前空間とすべての外側の名前空間です。さらに、クラス定義から見えるものに関連付けられた名前空間が追加されます。基本クラスの関連付けられた名前空間、テンプレートの場合はテンプレート引数の名前空間などです。これはフェーズ II ルックアップであり、引数依存ルックアップとも呼ばれます(もちろん、用語は完全に同一ではなく、詳細は上記のように簡単ではないと思います)。

あなたが引用したコードdo_run()では、グローバルスコープの関数は明らかにlib::details::runner<domain::mystruct>、グローバル名前空間にあるため見つかります。に移動した場合にも検出されdomainます。ただし、名前空間のdo_run()メソッドはインスタンス化で見つかりません。関連する名前空間はグローバル名前空間のみですlib::detailsが、関数は存在せず、依存名であるためインスタンス化まで検索されません。lib::details::runner<int>int

そうは言っても、MSVC++ は指定された方法で 2 フェーズの名前検索を実装していないことを理解していますが、どのように逸脱しているかはわかりません。

于 2012-11-21T20:52:55.453 に答える