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 jest ClassTemplate<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 do U lub tablicy U , klasy i przestrzenie nazw powiązane z U Przykład: void (*fptr)(A); f(fptr); , obejmuje przestrzenie nazw i klasy związane z void(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 z A
  • 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 z A , 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