簡體   English   中英

在C ++中的模板化基類中查找名稱

[英]Finding names in templatized base classes in C++

我正在閱讀有效的C ++ 3rd Edition,項目43“知道如何訪問模板化基類中的名稱”。

template<typename T>
class B {
    T i;
};

template<typename T>
class D: public B<T> {
public:
    void Foo() {
        T a = B<T>::i;
    }
};

int main() {
    D<int> d;
}

對於以上代碼,我知道是否在D::Foo() i之前未添加B<T>:: ,編譯器會抱怨“未在此范圍內聲明i ”。 (但是它並沒有抱怨iB是私人的。)

但是,如果T i; 沒有在B中聲明,如下所示,編譯進行順利。

template<typename T>
class B {
};

template<typename T>
class D: public B<T> {
public:
    void Foo() {
        T a = B<T>::i;
    }
};

int main() {
    D<int> d;
}

默認情況下,編譯器不在模板化的基類中找到名稱。 但是,為什么我甚至告訴他們,他們仍然不這樣做?

但是,為什么我甚至告訴他們,他們仍然不這樣做?

因為沒有使用成員函數Foo ,所以根本不會實例化它。

這適用於類模板的成員:除非在程序中使用了該成員,否則不會實例化該成員,並且不需要定義。

如果調用Foo可能會出錯 ,例如

D<int> d;
d.Foo();

BTW

但這並沒有抱怨iB是私人的。

因為在名稱查找之后執行了可訪問性檢查。 沒有找到i的名字,則無法檢查任何內容的可訪問性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM