[英]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.