2012-10-09 218 views
1
template<typename T1, typename T2, typename T3> 
class A: public A<T1, T2, void> { 
public: 
    T1 a; 
    T2 b; 
    T3 c; 

    void set() { a = aa; } // Cannot find variable `aa' here! 
}; 

template<typename T1, typename T2> 
class A<T1, T2, void> { 
public: 
    T1 aa; 
    T2 bb; 
}; 

如上繼承,我有一個模板類A,及其部分專門形式A'。那麼A有可能從A'繼承?根據g ++,這似乎確定。然而,當我試圖訪問A'中的成員時,g ++開始抱怨:找不到那個符號。任何人都知道爲什麼?C++從專門模板類

+1

'如上所述,我有一個模板類A和它的部分專用形式A'。那麼A有可能從A'繼承?'這聽起來不像是繼承自己的類嗎? – SingerOfTheFall

+0

試着說'this-> aa'而不是'aa'吧? – Mehrdad

+0

@SingerOfTheFall - 不,它沒有。它只是從更具體的一個派生出更通用的形式。前一段時間與容器一起使用的技巧是在void/void *上派生form/include容器專門化,它實現了所有的機制,並且只適用於通用形式。 – Tomek

回答

1

據我記憶,你必須把'a'派生類與'使用'拉。下面的(我不記得確切的語法所以請原諒我的任何編譯問題)添加到您的通用模板:

using A<T1, T2, void>::aa; 

編輯:由於邁赫達德注意到這個 - > AA也應該工作。

0

該名稱使用C++模板查找規則可能看起來有點不直觀。當編譯器首先解析模板定義時,它將解析所有名稱,這些名稱不是模板參數相關的。當涉及到模板實例時,它將解決其餘的問題。

如果看一看類A的定義而已,沒有明顯的上類型參數T1,T2或T3的符號AA的依賴性。因此,編譯器試圖解析名稱,但它不能,因爲該名稱在該環境中未定義。

所以,說服編譯器做你想要的東西,你必須使用以下招數:

  • 最簡單的可能是這個 - > AA。由於這個有一個模板參數相關的超類,它的成員只能在模板實例化時查找,所以一切都很好。

  • 資格與超類的構件,即使用甲< T1,T2,空隙> :: AA。這使得依賴非常明顯。您也可以使用使用指令,這樣就不必每次都輸入。