如果基類在派生類中被模板化,為什么基類的成員在派生類中不可用?
在編譯時,所有型別都應該被實體化,所以我看不出有什么不同或為什么不同。我可以看到一個論點,即能夠創建無法決議的型別;但是,這感覺像是編譯時錯誤,而不是對語言的限制。
更明確地說,為什么這有效?
template<typename T>
class A{
protected:
int member;
};
class B: public A<int>{
decltype(member) another_member;
};
但是,這不行嗎?
template<typename T>
class A{
protected:
int member;
};
template<typename T>
class B: public A<T>{
decltype(member) another_member;
};
uj5u.com熱心網友回復:
這個問題有一個 ISOCPP 常見問題解答。
https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
并閱讀下一篇關于它如何無聲地傷害你
https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-silent-bug
基本上編譯器不會查看模板化的基類。原因很可能是當時具體的類不存在。
前面的例子之所以有效,A<int>是因為它是一個具體的類,而A<T>不是。出于同樣的原因,您被迫添加typename引數和成員。
你應該把范圍放回原處
decltype(A<T>::member)
甚至(令人驚訝地)
decltype(B::member)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370016.html
上一篇:C 中可變引數模板對的列印方法
