關(guān)于模板化基類的變量
2023-01-10 11:19 作者:sxlxcsxlxc | 我要投稿
這大概是c++ template 的基礎(chǔ)吧,但是還是挺有意思的?
前段時間寫 kinetic priority queue 想試試用模板(實(shí)際上并沒有這種必要),發(fā)現(xiàn)派生類不能訪問到模板化的基類里面的成員,必須要用this才能訪問,感覺很奇怪。昨天在effective c++上面看到43條 know how to access names in templatized base classes 才知道是怎么回事。
我本來以為是這樣:由于基類是個模板類,繼承的時候并不知道基類當(dāng)中到底有沒有我想要訪問的變量,所以必須用this或者明確表示我要訪問基類的那個變量,于是編譯器就假設(shè)這個名字確實(shí)存在并且確實(shí)是個變量。然而仔細(xì)一想為什么編譯器會不了解我想要訪問的名字的信息呢?基類的定義編譯器已經(jīng)知道了,在實(shí)例化模板的時候基類自然也會有一份對應(yīng)類型的代碼生成,編譯器應(yīng)該可以獲取到模板基類當(dāng)中的所有信息,并不會產(chǎn)生什么問題。
看了書才知道,問題出在模板全特化
但是這又有什么問題呢,如果是在模板參數(shù)實(shí)例化的時候編譯器一樣可以知道基類的信息。好像只要在模板實(shí)例化的時候再來診斷問題就沒有這些麻煩了。只能說,較早發(fā)現(xiàn)問題應(yīng)該是比較好的。
另外,一個不能在 base class list 或者 member initialization list 當(dāng)中使用typename的例子
標(biāo)簽: