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 つの方法があります。
do_run(domain::mystruct)
名前空間ドメインに入れます。do_run(domain::mystruct)
名前空間 lib::detailsに入れます。using ::do_run
名前空間 lib::details 内に追加します。
したがって、コンテキストは名前空間 lib::details と名前空間ドメインであると推測しましたか?
コンパイラ VS2010