Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承不';当使用模板时,它不能正常工作_C++_Templates_Inheritance_This - Fatal编程技术网

C++ 继承不';当使用模板时,它不能正常工作

C++ 继承不';当使用模板时,它不能正常工作,c++,templates,inheritance,this,C++,Templates,Inheritance,This,我在继承方面有问题。我创建这个示例或多或少地说明了我的问题。问题是,如果我公开派生自公开派生自某个类的类,那么我必须一直访问原始类中的受保护成员。但是,当我使用模板时,情况似乎并非如此 事实上,下面的例子在'n++;'行中抱怨表示“n”未在范围中声明。但是,如果我在没有模板的情况下这样做。代码编译得很好。发生了什么事 #include<iostream> template<typename T> class base{ protected: T n; pub

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

事实上,下面的例子在'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;
}
#包括
模板
阶级基础{
受保护的:
T n;
公众:
T getn();
base();
};
模板
T base::getn(){
返回n;
}
模板
base::base(){
n=8;
}
模板
班级名称:公共基地{
受保护的:
公众:
};
模板
班奶奶:公公爸爸{
受保护的:
公众:
T-普鲁松();
};
模板
T granny::plusone(){
//本->n=本->n+1;
n++;
返回n;
}
int main(){
奶奶,妈妈;
int su=oldmammy.getn();
std::cout
n
在这里是一个。您必须明确指出
n
来自何处,否则编译器不知道您指的是哪个
n
(请注意,可能有一些
base
专门化没有名为
n
的成员)

您可以通过以下方式实现此目的:

this->n;
或:

base::n;

而不是代码中的
n

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

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

原因是编译器不对模板基类成员进行任何假设(
n
,在本例中,这取决于类型T)以防基类的部分专门化不包括其中一些成员。

谢谢tacp。我一直在努力解决这个问题。+1用于完整和简短的测试用例。这里有一个精确的解释:好的。可以。顺便说一句,我不是这个网站的普通用户。它在这里是如何工作的。我是否键入[已解决]标题?@WilmerEHenaoH中有一个“\/”符号与答案一起,如果你接受某人的答案,你只需单击该符号,这意味着答案解决了你的问题。但是,如果其他人愿意,他们仍然可以发布他们的答案。
 this->n = this->n + 1;
 return this->n;