수색…


어떤 기능이 발견되는지

함수는 먼저 인수 유형 T 에 따라 다음 중 하나 이상을 포함하는 "연관된 클래스""연관된 네임 스페이스" 세트를 수집하여 발견됩니다. 먼저 클래스, 열거 및 클래스 템플릿 전문화 규칙에 대한 규칙을 보여줍니다.

  • T 가 중첩 클래스이고, 멤버 열거 형이며, 그 다음에 그 클래스를 둘러싼 클래스입니다.
  • T 가 열거 형일 경우 (클래스 멤버 일 수도 있습니다!), 가장 안쪽의 네임 스페이스입니다.
  • T 가 클래스 인 경우 (중첩 될 수도 있습니다!), 모든 기본 클래스와 클래스 자체. 모든 관련 클래스의 가장 안쪽에있는 네임 스페이스입니다.
  • TClassTemplate<TemplateArguments> (클래스 이기도 합니다!) 인 경우 템플릿 인수가있는 경우 템플릿 유형 인수, 템플릿 템플릿 인수의 네임 스페이스 및 템플릿 템플릿 인수의 주변 클래스와 연결된 클래스 및 네임 스페이스입니다. 회원 템플릿

이제 builtin 유형에 대한 몇 가지 규칙이 있습니다.

  • 경우 T 포인터이다 U 또는 배열 U 와 관련된 클래스와 네임 스페이스 U . 예 : void (*fptr)(A); f(fptr); void(A) 와 관련된 네임 스페이스와 클래스를 포함합니다 (다음 규칙 참조).
  • T 가 함수 유형이면 매개 변수 및 반환 유형과 관련된 클래스 및 네임 스페이스입니다. 예 : void(A) 것이라고는과 관련된 네임 스페이스와 클래스 포함 A .
  • T 가 멤버에 대한 포인터 인 경우 멤버 유형과 관련된 클래스 및 네임 스페이스가 멤버 함수에 대한 포인터와 데이터 멤버에 대한 포인터 모두에 적용될 수 있습니다. 예 : BA::*p; void (A::*pf)(B); f(p); f(pf); A , B , void(B) 와 관련된 네임 스페이스와 클래스를 포함합니다 void(B) 위의 함수 유형에 대한 글 머리 기호 적용).

모든 관련 네임 스페이스 내의 모든 함수와 템플릿은 인수 종속적 인 조회에 의해 발견됩니다. 또한 연결된 클래스에서 선언 된 네임 스페이스 범위 friend 함수가 발견 되며 일반적으로 표시되지 않습니다. 그러나 지시문 사용은 무시됩니다.

다음 예제 호출은 모두 유효하며 f 의 네임 스페이스 이름을 f 로 한정하지 않습니다.

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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow