簡體   English   中英

模板隱式實例化在使用之前發生

[英]Template implicit instantiation occurs before using it

我有一個關於模板實例化的問題。 我認為模板隱式實例化在需要時發生。 讓我們看下面的例子:

template<typename T>
struct Base{
    void test();
};

template <typename T> void Base<T>::test(){ }

template<typename T>
struct Derived : Base<T>{
    void derived();
};

template <typename T> void Derived<T>::derived(){ test(); }

http://coliru.stacked-crooked.com/a/8c6ab39de2f8e701

此代碼無法編譯。 我認為僅在顯式或隱式實例化時才應檢查test的存在,如以下示例所示:

template<typename T>
struct Derived{
    void derived();
};

template <typename T> void Derived<T>::derived(){ T::test(); }  //fine

首次解析模板時,定義中的所有名稱均為“從屬”名稱或“非從屬”名稱。 非相關名稱必須與模板定義點之前先前聲明的內容匹配。 在為特定實例知道模板參數之前,不查找從屬名稱。 這稱為“兩階段查找”。

在您的示例中, test(); 沒有要依賴test ,因此它是非依賴的,並立即進行查找。 找不到Base<T>test ,因為專業化的Base可能沒有成員test ,或者可能完全不同地聲明它。

您可以通過編寫this->test();來使test為從屬名稱this->test(); Base<T>::test(); 相反,然后將編譯該示例。

暫無
暫無

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

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