c++ - 使用模板时继承不起作用

标签 c++ templates inheritance this

<分区>

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

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

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

最佳答案

一个快速的解决方法是在变量之前应用this:

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

原因是编译器不假设模板基类成员(n 在这种情况下,它依赖于类型 T)以防基类的部分特化不包括其中一些成员。

关于c++ - 使用模板时继承不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15891968/

相关文章:

c++ - 与关键字 'private' 相关的错误

c++ - 如何正确初始化模板类型的成员变量?

c++ - 调用基本构造函数而不直接调用

java - 默认方法一会返回true,然后返回false? (可能的 JVM 错误)

c++ - 从 Visual Studio 2008 升级到 Visual Studio 2013 时二进制大小增加 30%

c++ - 找不到 Visual Studio 2013 的 WRL 项目模板

python - SWIG 3 使用模板化构造函数包装未模板化的类

c++ - 模板隐式转换

c++ - 如何派生/扩展递归类

c++ - 使球相互反弹(openGL)