>. 가능한 Duplicate: >. [공식적으로 지정하십시오. 유형 이름 지우시겠습니까?] (https://stackoverflow.com/questions/1600936/officially-what-is-typename-for) >. [어디에 왜 꼭 동일팔레트에 템플릿에는 및 유형 이름 여러_키워드?] (https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-template-and-typename)
텍스트 - 끝 - < 자동으로 삽입됨 >;!
아래 코드는 고려해보십시오.
template<class K>
class C {
struct P {};
vector<P> vec;
void f();
};
template<class K> void C<K>::f() {
typename vector<P>::iterator p = vec.begin();
}
왜 " typename"; 필요한 키워드 예제에서와? 다른 모든 경우를 발생합니까 " typename"; 지정해야 합니다.
짧은 대답: 즉, a 종속적입니다 이름을 언급할 때마다 네스트된 이름이 포틀릿이 인스턴스입니다 안에 네스트됩니다 알 수 없는 매개변수입니다.
긴 대답: 세 가지 계층 엔티티에는 c++에서. 값뿐만 유형 및 템플릿일. 이러한 모든 이름을 가질 수 있는 t tell you, 이름, 혼자 doesn& # 39 의 엔티티에는 계층화할 때문이다. # 39 에 대한 정보가 아니라 엔티티에는 컨텍스트입니다 name& 과정을 추론할 수 있어야 합니다.
이 때, 당신은 추론 불가능한 지정할 수 있다.
template <typename> struct Magic; // defined somewhere else
template <typename T> struct A
{
static const int value = Magic<T>::gnarl; // assumed "value"
typedef typename Magic<T>::brugh my_type; // decreed "type"
// ^^^^^^^^
void foo() {
Magic<T>::template kwpq<T>(1, 'a', .5); // decreed "template"
// ^^^^^^^^
}
};
이 이름은 ',', 'Magic< 비틀다 magic< t>;;;; 콰프크 엑스프리시아테드 T> magic< t> 브루흐' 와 '불가능하다' 때문에 알 수 있었다. 이후 '매직' 은 ',' 자연에 매우 , 템플리트와 유형의 Magic< T> 달려 있는 특수화 T '-' 에서 완전히 다른 주요 템플리트와 예를 들어 있을 수 있습니다.
어떨거라고 ',' 종속 이름님은 비틀다 magic< t>, 사실은, 정의, 여기서 't' re 인사이드라면 we& # 39 포틀릿이 알 수 없습니다. 만일 우리가 ',' 이 차이가 있기 때문에, 사용되는 Magic< int> 컴파일러와의 계시나니 (약속하시겠어요!) 전체 정의, ',' Magic< int>.
(스케쳐내 테스트하려면 이 교도관님도요, here& # 39 의 정의를 사용할 수 있는 샘플 '매직'. '사면' 에 대해 간략하게 스페샤리자이션 콘스테스파르 사용. 경우 기존 컴파일러, feel free to 변경하십시오 pre-C++11 정적 멤버 상수입니다 선언은 이 이전 스타일의 양식.)
template <typename T> struct Magic
{
static const T gnarl;
typedef T & brugh;
template <typename S> static void kwpq(int, char, double) { T x; }
};
template <> struct Magic<signed char>
{
// note that `gnarl` is absent
static constexpr long double brugh = 0.25; // `brugh` is now a value
template <typename S> static int kwpq(int a, int b) { return a + b; }
};
사용법:
int main()
{
A<int> a;
a.foo();
return Magic<signed char>::kwpq<float>(2, 3); // no disambiguation here!
}
이 때문에 '유형 이름' 키워드 '에' P ',' 은 요구되는가 반복자가 종속적입니다 유형. # 39 는 경우, 컴파일러는 can& 것 때문에 값이거나 반복자가 't' 문자 '유형 이름 값을 solaris. 않으면' 소리 지르고 있다. # 39, s 는 유형 종속적임 it& 있을 때마다 필요한 인수를 포틀릿이 받을시간은 컨텍스트로 인컨텍스트 유형 또는 그 값을 약간만이라도 유효함. 예를 들어, 기본 클래스 (base class) '로' 유형 이름 필요하지 않을 만큼 반드시 유형:.
템플리트를 사용할 수 있는 '키워드' 가 같은 주제에 관한 사실을 일부 컴파일러는 함수 종속 이름은 템플리트를 값 대신.
이 때마다 유형 이름 키워드 요구되는가 종속된 유형 이름 (# 39, & # 39, know& 수 있기 때문에 컴파일러와의 템플리트를 매개변수에서 이 의미를 식별자입니다 ( 유형 값 또는 필요없이 전체 심볼 테이블 맨 첫 번째 단계).
이 같은 의미 및 유형 이름 없는 조금 덜 흔한 lone keyword 일반 템플리트를 매개변수입니다 사용할 경우 유용한 수도 있습니다. http://ideone.com/amImX
#include <string>
#include <list>
#include <vector>
template <template <typename, typename> class Container,
template <typename> class Alloc = std::allocator>
struct ContainerTests
{
typedef Container<int, Alloc<int> > IntContainer;
typedef Container<std::string, Alloc<int> > StringContainer;
//
void DoTests()
{
IntContainer ints;
StringContainer strings;
// ... etc
}
};
int main()
{
ContainerTests<std::vector> t1;
ContainerTests<std::list> t2;
t1.DoTests();
t2.DoTests();
}