使用模板时,继承不起作用
inheritance doesn't work as it should when using templates
我有一个继承问题。我创建这个例子是为了或多或少地展示我的问题。问题是,如果我公开地从一个公开地从一个类派生出来的类派生出来,那么我必须一直访问原始类中的受保护成员。但是,当我使用模板时,情况似乎不是这样。
实际上,下面的例子在'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)做任何假设,以防基类的部分特化不包括这些成员。
n
在这里是一个从属名称。你必须明确地指出n
来自哪里,否则编译器不知道你引用的是哪个n
(注意,可能有一些base
专门化没有名为n
的成员)。
你可以使用:
this->n;
或:
base<T>::n;
代替代码中的n
。
相关文章:
- 为什么在保护模式下继承升级不起作用
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 带有此指针的模板类多重继承构造函数不起作用?
- 我的二传手在新类中不起作用(继承)
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 为什么多个头文件和源文件中的C++继承不起作用?
- C++ 多级继承不起作用
- C++,继承的复制因子不起作用
- C++为什么继承不起作用
- 在C++中实现方法时继承不起作用
- .cpp.模板类继承不起作用
- 似乎头文件被忽略了/继承平原不起作用
- C++继承在堆栈上不起作用
- 使用继承时,带有 CRTP 的类型定义不起作用
- 类继承代码不起作用
- C++11构造函数继承不起作用
- c++中的继承不起作用.编译以下c++代码时发生链接器错误
- 使用模板时,继承不起作用
- 派生类的继承方法不起作用
- 具有继承的重载方法/运算符不起作用