2013-07-28 2 views
3

클래스 사이에 상속 유형 별칭이 있지만 클래스 템플릿 사이에 보이지 않습니다.템플릿 내 별칭 유형 상속

#include <iostream> 

//template<typename T> 
struct Test1 
{ 
// using t1=T; 
    using t1=int; 
}; 

//template<typename T> 
struct Test2: public Test1//<T> 
{ 
    t1 x; 
}; 

int main(int argc, char *argv[]) { 
// Test2<int> a; 
    Test2 a; 
    a.x=5; 
    std::cout << a.x << std::endl; 
} 

을하고이 코드는하지 않습니다 :

#include <iostream> 

template<typename T> 
struct Test1 
{ 
    using t1=T; 
}; 

template<typename T> 
struct Test2: public Test1<T> 
{ 
    t1 x; 
}; 

int main(int argc, char *argv[]) { 
    Test2<int> a; 
    a.x=5; 
    std::cout << a.x << std::endl; 
} 

는 종류의 템플릿을 상속하지 않습니다이 코드가 작동하는 이유는 이해가 안 돼요? Xeo 위의 댓글에서 지적 하듯 그렇게,

typename Test1<T>::t1 x; 

과 :

+4

는'두 번째 예제에서 t1'는 * 따라 이름 *입니다 (왜냐하면 그것이 발생하는 기본 클래스가'Test2'의 템플릿 매개 변수에 종속적 인 템플릿이기 때문에)'typename Test2 :: t1'을 사용하십시오. – Xeo

+0

@xeo, yeah, 네 말이 맞아. 그게 효과가있어.하지만 왜 궁금해하니 .. – Antonio

+0

@Xeo, 그거야. 필자는 오타를 만들었다 고 생각하고'typename Test1 :: t1'이 필요합니다. 나는하지 않고,'typename Test2 :: t1'을 사용하여 훨씬 행복하다. 감사. – Omegaman

답변

2

다음은 작동합니다

typename Test2::t1 x; 
+1

네, 그렇지만 @Xeo가 위에서 지적한 것처럼, typename Test2 :: t1 x'는 입력이 적고 구두점이 적으며, 파생 된 클래스와 관련된 모든 참조를 유지합니다. – Omegaman

+0

좋은 소리! 그러나 Test2를 구현하는 동안 Test2의 정적 요소를 호출하는 것은 다소 직감적이라고 느낍니다. 그러나, 완벽하게 유효합니다. – sgun

+0

그것은 상속 재산을 내게 깨끗하게합니다. 나중에 그 정의를'struct Test2 : public OtherTest '으로 바꾸기로 결정했다면 구현을 통해 의존성을 찾아야 할 필요가 없습니다. 실제로, 나는 typename을'Test1 '으로 참조하고 나서 baseclass를 바꾸지 만 텍스트 의존성을 놓친다면, 내 상속 구조가 다르게 함축되어 있음에도 불구하고'Test1 :: t1'을 사용하여 자동으로 끝날 것입니다. – Omegaman