【问题标题】:inheritance doesn't work as it should when using templates [duplicate]使用模板时继承不能正常工作[重复]
【发布时间】:2013-04-09 01:47:51
【问题描述】:

我遇到了继承问题。我创建了这个例子来或多或少地展示我的问题。问题是,如果我从公开派生自类的类公开派生,那么我必须一直访问原始类中的受保护成员。但是,当我使用模板时,情况似乎并非如此。

事实上,下面的示例在 where '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;
}

顺便说一句。告诉我是否应该发布没有模板来比较的代码..

【问题讨论】:

标签: c++ templates inheritance this


【解决方案1】:

快速解决方法是在变量前应用this

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

原因是编译器不对模板基类成员(在这种情况下为n,这取决于类型 T)做任何假设,以防基类的部分特化不包括某些这些成员。

【讨论】:

  • 好的。这样可行。顺便说一句,我不是这个网站的普通用户。它是如何在这里工作的。我是否在标题中输入 [已解决]?
  • @WilmerEHenaoH 答案旁边有一个“\/”符号,如果你接受一个人的答案,你只需点击那个符号,这意味着答案解决了你的问题。但是,其他人仍然可以根据需要发布他们的答案。
【解决方案2】:

n 在这里是dependent name。您必须明确指出 n 来自哪里,否则编译器不知道您指的是哪个 n(请注意,可能有一些 base 专业化没有名为 n 的成员)。

您可以通过以下方式实现:

this->n;

或者:

base<T>::n;

而不是您的代码中的n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多