다음을 통해 공유


로컬로 선언 된 이름에 대 한 이름 확인

서식 파일의 이름으로 또는 템플릿 인수 없이 참조할 수 있습니다.클래스 템플릿의 범위에 서식 파일을 이름 자체를 참조합니다.템플릿 특수화 나 부분 특수화에 범위 이름 만으로는 특수화 나 부분 특수화를 참조합니다.다른 특수화 나 부분 특수화에 템플릿 또한, 해당 템플릿 인수와 함께 참조할 수 있습니다.

예제

다음 코드를 클래스 템플릿 이름 A 특수화 나 부분 특수화의 범위에서 다른 방식으로 해석 됩니다 보여 줍니다.

// template_name_resolution3.cpp
// compile with: /c
template <class T> class A {
   A* a1;   // A refers to A<T>
   A<int>* a2;  // A<int> refers to a specialization of A.
   A<T*>* a3;   // A<T*> refers to the partial specialization A<T*>.
};

template <class T> class A<T*> {
   A* a4; // A refers to A<T*>.
};

template<> class A<int> {
   A* a5; // A refers to A<int>.
};

템플릿 매개 변수와 다른 개체 간의 이름 충돌을 경우에 템플릿 매개 변수 수 있습니다 하거나 숨길 수 없습니다.다음 규칙 우선 순위를 결정 하는 데 도움이 됩니다.

템플릿 매개 변수에 먼저 클래스 또는 함수 템플릿 끝날 때까지 나타나는 위치에 지점에서 범위입니다.템플릿 인수 목록이 나 기본 클래스 목록에 이름을 다시 표시 되 면 동일한 형식으로 나타냅니다.표준 C++에서는 템플릿 매개 변수를 동일한 다른 이름이 같은 범위에 선언할 수 있습니다.Microsoft 확장 템플릿 매개 변수를 템플릿 범위에서 다시 정의 될 수 있습니다.클래스 템플릿의 기본 사양에 템플릿 매개 변수를 사용 하 여 다음 예제를 보여 줍니다.

// template_name_resolution4.cpp
// compile with: /EHsc
template <class T>
class Base1 {};

template <class T>
class Derived1 : Base1<T> {};

int main() {
   // Derived1<int> d;
}

클래스 템플릿 외부는 템플릿 멤버 함수를 정의 하는 경우 다른 템플릿 매개 변수 이름을 사용할 수 있습니다.템플릿 멤버 함수 정의 선언 하지, 다른 멤버 선언의 정의가 충돌에 사용 되는 이름, 멤버 템플릿 선언에 우선 보다 다른 템플릿 매개 변수 이름을 사용 하는 경우.

// template_name_resolution5.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <class T> class C {
public:
   struct Z {
      Z() { cout << "Z::Z()" << endl; }
   };
   void f();
};

template <class Z>
void C<Z>::f() {
   // Z refers to the struct Z, not to the template arg;
   // Therefore, the constructor for struct Z will be called.
   Z z;
}

int main() {
   C<int> c;
   c.f();
}
  

템플릿 함수 또는 멤버 함수 외부에서 템플릿에 선언 된 네임 스페이스를 정의할 때 템플릿 인수가 다른 네임 스페이스의 구성원의 이름 보다 우선 합니다.

// template_name_resolution6.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

namespace NS {
   void g() { cout << "NS::g" << endl; }

   template <class T> struct C {
      void f();
      void g() { cout << "C<T>::g" << endl; }
   };
};

template <class T>
void NS::C<T>::f() {
   g(); // C<T>::g, not NS::g
};

int main() {
   NS::C<int> c;
   c.f();
}
  

그런 다음 템플릿 클래스 선언 외부의 경우 템플릿 클래스 템플릿 인수에 종속 되지 않는 기본 클래스와 해당 멤버의 기본 클래스 또는 템플릿 인수 이름이 같은 경우는 정의에 기본 클래스 또는 멤버 이름 템플릿 인수를 숨깁니다.

// template_name_resolution7.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct B {
   int i;
   void print() { cout << "Base" << endl; }
};

template <class T, int i> struct C : public B {
   void f();
};

template <class B, int i>
void C<B, i>::f() {
   B b;   // Base class b, not template argument.
   b.print();
   i = 1; // Set base class's i to 1.
}

int main() {
   C<int, 1> c;
   c.f();
   cout << c.i << endl;
}
  

참고 항목

참조

서식 및 이름 확인