[英]Why does function calls to templatized base classes not work?
考慮以下示例:
template <typename T>
class A {
public:
void f() {
cout << "A::f()\n";
}
};
template<>
class A<int> {
};
template<typename T>
class B: public A<T> {
public:
void g() {
cout << "B::g()\n";
A<T>::f();
}
};
int main() {
B<int> b; // (1)
b.g(); // (2)
return 0;
}
顯然,對於int模板類型,在B :: g()中對A :: f()的調用將失敗。 我的問題是通話什么時候失敗? 在(1)或(2)? 我認為應該是(1),因為到那時編譯器會使用模板類型int創建一個新類並進行編譯。 該編譯應該在f()正確的情況下失敗?
它將在(2)處失敗,這是標准所保證的。 在第14.7.1 / 1,它說實例化一個模板類沒有實例化它的成員定義。 只有在使用該成員后,才會發生這種情況。
如果從代碼中刪除(2),它將進行編譯。
14.7.1 / 1摘錄:
類模板專業化的隱式實例化導致類成員函數,成員類,靜態數據成員和成員模板的聲明而不是定義或默認參數的隱式實例化; 它導致成員匿名聯合的定義的隱式實例化。
強調我的。
Visual Studio的診斷具有誤導性。 它會說see reference to class template instantiation 'B<T>' being compiled
。 它的意思不是“我在實例化B<T>
失敗”,而是“我在實例化B<T>
類的成員時失敗”
它在2)失敗。 模板的成員函數在調用時實例化。
更精確地講:實例化類模板時,將實例化其成員函數的聲明,而不是其定義。 使用該函數時將實例化該定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.