亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么派生的模板類無法訪問基本模板類的標識符?

為什么派生的模板類無法訪問基本模板類的標識符?

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 關注
  • 548 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號