为了账号安全,请及时绑定邮箱和手机立即绑定

为什么派生的模板类无法访问基本模板类的标识符?

为什么派生的模板类无法访问基本模板类的标识符?

C++
肥皂起泡泡 2019-11-12 11:19:37
考虑:template <typename T>class Base{    public:        static const bool ZEROFILL = true;        static const bool NO_ZEROFILL = false;}template <typename T>class Derived : public Base<T>{    public:         Derived( bool initZero = NO_ZEROFILL );    // NO_ZEROFILL is not visible        ~Derived();}我无法使用GCC g ++ 3.4.4(cygwin)进行编译。在将它们转换为类模板之前,它们是非泛型的,派生类能够查看基类的静态成员。C ++规范的要求中是否存在这种可见性损失,还是我需要采用语法更改?据我了解,每个实例Base<T>都会有它自己的静态成员“ ZEROFILL”和“ NO_ZEROFILL”,这Base<float>::ZEROFILL和Base<double>::ZEROFILL是不同的变量,但我真的不关心; 该常量用于代码的可读性。我想使用静态常量,因为就名称冲突而言,这比使用宏或全局方法更安全。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

这是您的两阶段查找。


Base<T>::NO_ZEROFILL(所有大写字母标识符均为boo,宏除外,BTW)是取决于的标识符T。

因为当编译器第一次解析模板时,还没有实际的类型可以替代T,所以编译器不会“知道”什么Base<T>。因此,它无法知道您假定要在其中定义的任何标识符(可能会有某种特殊化,T编译器稍后会看到),并且您无法从基类中定义的标识符中忽略基类限定条件。


这就是为什么您必须写Base<T>::NO_ZEROFILL(或this->NO_ZEROFILL)。这告诉编译器这NO_ZEROFILL是基类中的内容,它取决于T,并且它只能在实例化模板时稍后进行验证。因此,它将接受它而不尝试验证代码。

当通过为提供实际参数实例化模板时,只能稍后验证该代码T


查看完整回答
反对 回复 2019-11-12
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

试试这个程序


#include<iostream>

using namespace std;

template <class T> class base{

public:

T x;

base(T a){x=a;}

virtual T get(void){return x;}

};

template <class T>

class derived:public base<T>{

public:

derived(T a):base<T>(a){}

T get(void){return this->x+2;}

};

int main(void){

base<int> ob1(10);

cout<<ob1.get()<<endl;

derived<float> ob(10);

cout<<ob.get();

return 0;

}

在T get(void){return this->x+2;}直插U还可以使用范围解析(::)运营商。例如,尝试用


T get(void){return base<T>::x+2;}


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 526 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信