C++
Wyszukiwanie nazwy zależnej od argumentu
Szukaj…
Jakie funkcje są znalezione
Funkcje znajdują się najpierw poprzez zebranie zestawu „powiązanych klas” i „powiązanych przestrzeni nazw”, które zawierają jedną lub więcej z poniższych, w zależności od typu argumentu T
Najpierw pokażmy reguły dotyczące klas, wyliczeń i nazw specjalizacji szablonów klas.
- Jeśli
T
jest klasą zagnieżdżoną, wyliczeniem elementu, to jej otaczająca klasa. - Jeśli
T
jest wyliczeniem (może być również członkiem klasy!), Jego najbardziej wewnętrzna przestrzeń nazw. - Jeśli
T
jest klasą (może być również zagnieżdżona!), Wszystkie jej klasy podstawowe i sama klasa. Najbardziej wewnętrzna przestrzeń nazw wszystkich powiązanych klas. - Jeśli
T
jestClassTemplate<TemplateArguments>
(to także jest klasa!), Klasy i przestrzenie nazw powiązane z argumentami typu szablonu, przestrzeń nazw dowolnego argumentu szablonu szablonu i otaczająca klasa dowolnego argumentu szablonu szablonu, jeśli argumentem szablonu jest szablon członka.
Teraz istnieje również kilka zasad dla typów wbudowanych
- Jeśli
T
jest wskaźnikiem doU
lub tablicyU
, klasy i przestrzenie nazw powiązane zU
Przykład:void (*fptr)(A); f(fptr);
, obejmuje przestrzenie nazw i klasy związane zvoid(A)
(patrz następna reguła). - Jeśli
T
jest typem funkcji, klasy i przestrzenie nazw powiązane z parametrami i typami zwracanymi. Przykład:void(A)
obejmuje przestrzenie nazw i klasy powiązane zA
- Jeśli
T
jest wskaźnikiem do elementu, klasy i przestrzenie nazw powiązane z typem elementu (mogą mieć zastosowanie zarówno do wskaźnika do funkcji elementu, jak i wskaźnika do elementu danych!). Przykład:BA::*p; void (A::*pf)(B); f(p); f(pf);
obejmuje przestrzenie nazw i klasy powiązane zA
,B
,void(B)
(która stosuje punktor powyżej dla typów funkcji).
Wszystkie funkcje i szablony we wszystkich powiązanych przestrzeniach nazw są wyszukiwane zależnie od argumentów. Ponadto znaleziono funkcje zaprzyjaźnione z obszarem nazw zadeklarowane w powiązanych klasach , które zwykle nie są widoczne. Stosowanie dyrektyw jest jednak ignorowane.
Wszystkie poniższe przykładowe wywołania są prawidłowe, bez kwalifikowania f
według nazwy przestrzeni nazw w wywołaniu.
namespace A {
struct Z { };
namespace I { void g(Z); }
using namespace I;
struct X { struct Y { }; friend void f(Y) { } };
void f(X p) { }
void f(std::shared_ptr<X> p) { }
}
// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());
g(A::Z()); // invalid: "using namespace I;" is ignored!
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow