2012-04-23 2 views
1

템플릿을 통해 상속받은 클래스에서 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로 컴파일하려고하는 이유도 있습니다.

미리 감사드립니다. 칼

+0

IMHO, 템플릿 입력 매개 변수 목록 안에'typename' 키워드를 사용하고 대문자로 시작하는 클래스 이름을 쓰는 것이 좋습니다. – parallelgeek

답변

2

시도의 변화 :

template<class b> 
class C{ 
    typedef class b::A AA; 
    AA a; 
public: 
    void Cprint() {  a.print(); }; 
}; 

에 :

template<class b> 
class C{ 
    typedef typename b::A AA; 
    AA a; 
public: 
    void Cprint() {  a.print(); }; 
}; 

b::Adependent type (이 b에 사용되는 유형에 따라 달라집니다).

참고로 원래 게시 된 코드는 VS2008 및 VS2010으로 컴파일하지 못했습니다.

+0

예! 그거야. 정말 고맙습니다! 그래서 요점은 b 클래스는 구조체 또는 A 클래스라는 멤버가 아닌 클래스를 가질 수 있다고 생각하십니까? – user1352068

+0

예,'b :: A'는'static int' 일 수 있습니다. – hmjd