2012-04-23 50 views
1

我有一個關於從通過模板繼承的類中提取typedef的信息的問題。爲了說明我的問題,請考慮以下簡單示例:如何從通過模板繼承的類中提取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類應該能夠找出「B」類正在使用哪兩個「A」類。當我用g ++編譯時,上面的代碼完美地工作。但是,當我使用Intel的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 

是否有另一種方法可以實現類似的效果?當然,我的實際代碼要複雜得多,我希望以這種方式構建類。我還想用icpc而不是g ++編譯原因。

在此先感謝。 卡爾

+0

恕我直言,最好還在模板類型參數列表中使用'typename'關鍵字,並寫入從大寫字母開始的類名稱。 – parallelgeek 2012-04-23 20:48:29

回答

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 2012-04-23 21:45:28

+0

是的,'b :: A'可以是一個'static int'。 – hmjd 2012-04-23 21:47:44