C++模板二段名字查找方法
如下所示:
#include<iostream> using namespace std; void f(){ cout<<"global f()"<<endl; } template<typename T> class A { public: void f() { cout << "A::f()" << endl; } }; template<typename T> class B:public A<T> { public: void g() { f();//gloabl f() this->f();//A::f() A<T>::f();//A::f() } }; int main(){ B<int> b; b.g(); }
根據(jù) C++ 標(biāo)準(zhǔn),對(duì)模板代碼中的名字的查找,分為兩個(gè)階段進(jìn)行:
模板定義階段:剛被定義時(shí),只有模板中獨(dú)立的名字(可以理解為和模板參數(shù)無(wú)關(guān)的名字)參加查找
模板實(shí)例化階段:實(shí)例化模板代碼時(shí),非獨(dú)立的名字才參加查找。
如果沒(méi)有用模板,事情會(huì)簡(jiǎn)單很多。然而這里的 B 本身是模板,需要進(jìn)行二段式名字查找。
首先進(jìn)入 B 的模板定義階段,此時(shí) B 的基類(lèi) A<T> 依賴于模板參數(shù) T,所以是一個(gè)「非獨(dú)立」的名字。所以在這個(gè)階段,對(duì)于 B 來(lái)說(shuō) A<T> 這個(gè)名字是不存在的,于是 A<T>::f() 也不存在。但此時(shí)這段代碼仍舊是合法的,因?yàn)榇藭r(shí)編譯器可以認(rèn)為 f 是一個(gè)非成員函數(shù)。
當(dāng)稍晚些時(shí)候進(jìn)入 B 的模板實(shí)例化階段時(shí),編譯器已經(jīng)堅(jiān)持認(rèn)為f 是非成員函數(shù),縱使此時(shí)已經(jīng)可以查到 A<T>::f(),編譯器也不會(huì)去這么做。
「查非成員函數(shù)為什么要去基類(lèi)里面查呢?」于是就找不到了。
那我們回過(guò)頭來(lái)看 this->f():
模板定義階段:盡管沒(méi)法查到 A<T>::f(),但明晃晃的 this-> 告訴編譯器,f 是一個(gè)成員函數(shù),不是在 B 類(lèi)里,就是在 B 類(lèi)的基類(lèi)里,于是編譯器記住了
模板實(shí)例化階段:此時(shí)編譯器查找的對(duì)象是一個(gè)「成員函數(shù)」,首先在 B 中查,沒(méi)有找到;然后在其基類(lèi)里查,于是成功找到 A<T>::f(),功德圓滿。
以上就是小編為大家?guī)?lái)的C++模板二段名字查找方法全部?jī)?nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
C++ 基于BFS算法的走迷宮自動(dòng)尋路的實(shí)現(xiàn)
這篇文章主要為大家介紹了C++ 基于BFS算法實(shí)現(xiàn)走迷宮自動(dòng)尋路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07一起來(lái)學(xué)習(xí)C語(yǔ)言的輸入和輸出
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的輸入和輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼
今天通過(guò)本文給大家分享基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-11-11C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的前中后創(chuàng)建和遍歷詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹(shù)的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02