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

考虑:


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是不同的变量,但我真的不关心; 该常量用于代码的可读性。我想使用静态常量,因为就名称冲突而言,这比使用宏或全局方法更安全。


肥皂起泡泡
浏览 527回答 3
3回答

MYYA

这是您的两阶段查找。Base<T>::NO_ZEROFILL(所有大写字母标识符均为boo,宏除外,BTW)是取决于的标识符T。因为当编译器第一次解析模板时,还没有实际的类型可以替代T,所以编译器不会“知道”什么Base<T>。因此,它无法知道您假定要在其中定义的任何标识符(可能会有某种特殊化,T编译器稍后会看到),并且您无法从基类中定义的标识符中忽略基类限定条件。这就是为什么您必须写Base<T>::NO_ZEROFILL(或this->NO_ZEROFILL)。这告诉编译器这NO_ZEROFILL是基类中的内容,它取决于T,并且它只能在实例化模板时稍后进行验证。因此,它将接受它而不尝试验证代码。当通过为提供实际参数实例化模板时,只能稍后验证该代码T

斯蒂芬大帝

试试这个程序#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;}
打开App,查看更多内容
随时随地看视频慕课网APP