종속적인 형식에 대 한 이름 확인
사용 typename 정규화 된 이름이 지정 된 정규화 된 이름 종류를 식별 하 여 컴파일러가 템플릿 정의에 대 한.자세한 내용은 typename을 참조하십시오.
// template_name_resolution1.cpp
#include <stdio.h>
template <class T> class X
{
public:
void f(typename T::myType* mt) {}
};
class Yarg
{
public:
struct myType { };
};
int main()
{
X<Yarg> x;
x.f(new Yarg::myType());
printf("Name resolved by using typename keyword.");
}
Output
Name resolved by using typename keyword.
종속 이름에 대 한 이름 조회 이름 템플릿 정의의 컨텍스트에서 검사-예제를이 여기서 찾을 수 myFunction(char)-및 컨텍스트 템플릿 인스턴스화.다음 예제에서는 main에 템플릿을 인스턴스화할. 따라서의 MyNamespace::myFunction 인스턴스화 시점에서 표시 되 고 일치 하는 더 나은 선택입니다.MyNamespace::myFunction의 이름을 바꾼 경우 대신 myFunction(char)이 호출됩니다.
모든 이름은 종속 이름인 것처럼 확인됩니다.그럼에도 불구 하 고 모든 가능한 충돌 하는 경우 정규화 된 이름을 사용 하는 것이 좋습니다.
//template_name_resolution2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void myFunction(char)
{
cout << "Char myFunction" << endl;
}
template <class T> class Class1
{
public:
Class1(T i)
{
// If replaced with myFunction(1), myFunction(char)
// will be called
myFunction(i);
}
};
namespace MyNamespace
{
void myFunction(int)
{
cout << "Int MyNamespace::myFunction" << endl;
}
};
using namespace MyNamespace;
int main()
{
Class1<int>* c1 = new Class1<int>(100);
}
Output
Int MyNamespace::myFunction
템플릿 명확성
Visual Studio 2012의 Visual C++강화 된 C + + 98/03/11 "템플릿 이라는" 키워드로 명확성 표준 규칙.다음 예제에서는 Visual C++ 2010 맞지 않는 선과 표준에 맞는 줄을 모두 받아들입니다. Visual Studio 2012의 Visual C++표준에 맞는 줄만 사용할 수 있습니다.
#include <iostream>
#include <ostream>
#include <typeinfo>
using namespace std;
template <typename T> struct Allocator {
template <typename U> struct Rebind {
typedef Allocator<U> Other;
};
};
template <typename X, typename AY> struct Container {
#if defined(NONCONFORMANT)
typedef typename AY::Rebind<X>::Other AX; // nonconformant
#elif defined(CONFORMANT)
typedef typename AY::template Rebind<X>::Other AX; // conformant
#else
#error Define NONCONFORMANT or CONFORMANT.
#endif
};
int main() {
cout << typeid(Container<int, Allocator<float>>::AX).name() << endl;
}
명확성 규칙 준수 C++는 기본적으로 가정 하기 때문에 필요 AY::Rebind 서식 없는 및 다음 컴파일러 해석 "<"으로 덜-보다. 가에 대해 Rebind 올바르게 구문 분석할 수 있도록 템플릿입니다 "<"으로 꺾쇠 괄호.