2013-04-09 58 views
3

我遇到了繼承問題。我創建了這個例子來顯示或多或少的問題。問題是,如果我公開從派生類公開派生出來,那麼我必須一直訪問原始類中的受保護成員。但是,當我使用模板時,這似乎不是這種情況。繼承不能像使用模板時那樣工作

事實上,下面的例子會在'n ++;'的行上抱怨。說'n'沒有在範圍內聲明。但是,如果我沒有使用模板。代碼編譯得很好。到底是怎麼回事?

#include<iostream> 
template<typename T> 
class base{ 
protected: 
    T n; 
public: 
    T getn(); 
    base(); 
}; 

template<typename T> 
T base<T>::getn(){ 
    return n; 
} 

template<typename T> 
base<T>::base(){ 
    n = 8; 
} 

template<typename T> 
class daddy: public base<T>{ 
protected: 
public: 
}; 

template<typename T> 
class granny: public daddy<T>{ 
protected: 
public: 
    T plusone(); 
}; 

template<typename T> 
T granny<T>::plusone(){ 
    //this->n = this->n + 1; 
    n++; 
    return n; 
} 

int main(){ 
    granny<int> oldmommy; 

    int su = oldmommy.getn(); 
    std::cout << su << std::endl; 
    su = oldmommy.plusone(); 
    std::cout << "plusone" << su << std::endl; 
    return 0; 
} 

Btw。告訴我是否應該發佈沒有模板的代碼進行比較..

+0

謝謝tacp。我試圖弄清楚這一點。 – 2013-04-09 01:53:43

+0

+1爲完整和短的測試案例。 – 2013-04-09 01:55:09

+0

這裏有一個精確的解釋:http://stackoverflow.com/questions/7076169/not-declared-in-this-scope-error-with-templates-and-inheritance – Nbr44 2013-04-09 01:58:05

回答

3

甲快速修復是變量之前應用this

this->n = this->n + 1; 
return this->n; 

的原因是,編譯器對模板基類成員(在這種情況下,這是依賴於類型T n)任何假設如果基類的部分特化不包括這些成員中的一部分。

+0

好的。這樣可行。順便說一句,我不是這個網站的普通用戶。它在這裏如何工作。我在標題中輸入[求解]嗎? – 2013-04-09 02:04:12

+0

@WilmerEHenaoH有一個「\ /」符號和答案,如果你接受他的答案,你只需點擊該標誌,這意味着答案可以解決你的問題。但是,其他人如果願意,仍然可以發佈自己的答案。 – taocp 2013-04-09 02:07:04

2

ndependent name這裏。您必須明確指出n來自哪裏,否則編譯器不知道您指的是哪個n(請注意,可能有一些base專業化,它沒有名爲n的成員)。

您可以通過實現這一點:

this->n; 

或者:

base<T>::n; 

而不是n在你的代碼。