2013-05-07 51 views
3

的類成員的繼承,爲什麼T2給這個錯誤‘m_t’ was not declared in this scope,而TB是好的?在下面的代碼中混合模板

而我仍然可以在使用模板的同時在T2中訪問T1的成員?

// All good 
class TA 
{ 
    public: 
     TA() {} 

    protected: 
    int m_t; 
}; 

class TB : public TA 
{ 
    public: 
     TB() {} 

     int get() 
     { return m_t; } 

    protected: 
}; 

// Error in T2 
template<typename T> 
class T1 
{ 
    public: 
     T1() {} 

    protected: 
    int m_t; 
}; 

template<typename T> 
class T2 : public T1<T> 
{ 
    public: 
     T2() {} 

     int get() 
     { return m_t; } 

    protected: 
}; 
+0

試試'this-> m_t'。這是關於兩階段查找和依賴名稱。 – juanchopanza 2013-05-07 13:14:38

+1

相關:http://stackoverflow.com/q/605497/951890 – 2013-05-07 13:16:21

回答

7

您需要使用this->m_t才能使其成爲獨立名稱。編譯模板時,名稱分兩個階段查找。當編譯器首先解析模板時,會查找非從屬名稱。實例化模板時會查找相關名稱。將其更改爲this->m_t將延遲查找,直到get函數實際實例化之後,在這種情況下,基類類型是已知的,並且編譯器可以驗證該成員的存在。

+0

我有點失望,因爲遺傳現在看起來不現實。但是,謝謝它的作品。 – user2287453 2013-05-07 13:29:29