템플릿을 통해 상속받은 클래스에서 typedef'd 정보를 추출하는 것에 대한 질문이 있습니다. 내 질문을 설명하기 위해 다음 간단한 예제를 고려해보십시오.템플릿을 통해 상속 된 클래스에서 typedef 된 정보를 추출하는 방법은 무엇입니까?
#include <iostream>
class A1{
public:
void print(){ printf("I am A1\n"); };
};
class A2{
public:
void print(){ printf("I am A2\n"); };
};
class B1{
public:
typedef A1 A;
};
class B2{
public:
typedef A2 A;
};
template<class b>
class C{
typedef class b::A AA;
AA a;
public:
void Cprint() { a.print(); };
};
int main()
{
C<B1> c1;
c1.Cprint();
C<B2> c2;
c2.Cprint();
}
클래스 C는 클래스 매개 변수 (B1 또는 B2)를 템플릿 매개 변수로 사용합니다. B1과 B2는 모두 A라고 불리는 tyepdef를가집니다 (각각 A1과 A2 등급입니다). 컴파일 할 때, 클래스 C는 두 개의 "A"클래스 중 어느 것이 "B"클래스에서 사용되는지 알아낼 수 있어야합니다. g ++로 컴파일하면 위 코드가 완벽하게 작동합니다. 그러나 인텔의 icpc로 컴파일하면 다음 오류가 발생합니다.
test.cpp(24): error: typedef "A" may not be used in an elaborated type specifier
typedef class b::A AA;
^
detected during instantiation of class "C<b> [with b=B1]" at line 33
비슷한 효과를 얻을 수있는 다른 방법이 있습니까? 물론, 실제 코드는 훨씬 더 복잡합니다. 이런 식으로 클래스를 구조화해야하는 이유가 있습니다. gic이 아닌 icpc로 컴파일하려고하는 이유도 있습니다.
미리 감사드립니다. 칼
IMHO, 템플릿 입력 매개 변수 목록 안에'typename' 키워드를 사용하고 대문자로 시작하는 클래스 이름을 쓰는 것이 좋습니다. – parallelgeek