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在你的代码。