擴展問題“如果父類是模板,為什么禁止對其進行 decltype'ing 成員? ”。
Clang 和 GCC 都抱怨B無法訪問A::member,因為它受到保護。
但是,如果詢問特定實體,則B可以訪問,只有在擴展期間才會出現錯誤。A::memberBB<int>::type_name
為什么在這種情況下忽略了Aby的公共繼承B?(如果這就是正在發生的事情。)
template<typename T>
class A{
protected:
int member;
public:
using type_name = T;
};
template<typename T>
class B: public A<T>{
decltype(A<T>::member) another_member;
};
template<typename T,
typename P=typename T::type_name>
void foo(){}
// Force the instantiation of foo
void bar(){
foo<B<int>>();
}
uj5u.com熱心網友回復:
他們不是。使用B<T>::member.
麻煩來自,decltype(member)編譯器立即注意到member不在范圍內;但是,在decltype(A<T>::member)編譯器中,在模板擴展之前,無法判斷該成員是受保護的。導致錯誤中(大部分)不相關的模板擴展資訊堆疊。
由于B<T>不是friend的A<T>就不能訪問它protect通過它的名字編人員; 而是應該通過其限定名稱B<T>::member.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375306.html
