2011-05-16 65 views
9

我不敢相信gcc不會接受下面的代碼......請告訴我,如果從基本模板訪問內部類真的不可能,或者我錯過了什麼嗎?模板繼承內部類訪問問題

template <class T> class BaseClass 
{ 
public: 
    struct MyStruct 
    { 
     T *data; 
    }; 
}; 

template <class T> class ChildClass : public BaseClass <T> 
{ 
    public: 

    void problem() 
    { 
     MyStruct ms1; //error: 'MyStruct' was not declared in this scope 
     ::MyStruct ms2; //error: '::MyStruct' has not been declared 
     BaseClass<T>::MyStruct ms3; //error: expected `;' before 'ms3' 
    } 
}; 
+0

我編輯了這個問題,使問題更加明顯。最初,這聽起來像你是從內部類繼承的,並且模板在問題中的任何地方(但代碼)都沒有被提及,而它們是實際的問題。 – 2011-05-16 08:03:51

回答

14

的問題是,MyStruct是一個從屬名稱,所以你必須告訴編譯器推遲名稱查找,直到模板通過與基類名稱限定它實例:

typename BaseClass<T>::MyStruct ms1; 

欲瞭解更多信息,我會閱讀Parashift C++常見問題條目,"Why am I getting errors when my template-derived-class uses a nested type it inherits from its template-base-class?"

+0

謝謝!我無法相信我的問題的根源是typename關鍵字... – Ryan 2011-05-16 06:41:41