![](/img/trans.png)
[英]Why is a member template from private base class introduced with a using declaration inaccessible?
[英]Why is this class's own protected member inaccessible from a template method?
為什么不能從類的模板方法訪問受保護的成員?
我可能在這里錯過了一些特殊的朋友聲明,但這使我難以理解。 我覺得我應該能夠做到。
錯誤是:
error: 'char* ClassB<char>::a' is protected
來源示例:
template<typename T>
class ClassA;
template<typename T>
class ClassB {
protected:
T* a;
public:
ClassB()
: a(0) {}
template<typename U>
ClassB(const ClassB<U>& other)
:
// error: ‘char* ClassB<char>::a’ is protected
a(other.a) {}
};
////
template<typename T>
class ClassA : public ClassB<T> {
public:
ClassA() {}
};
////
namespace name {
typedef ClassA<char> A;
typedef ClassB<const char> B;
}
int main() {
name::A a;
name::B b = a;
return 0;
}
出於相同的原因,您不能這樣做,因為ClassA
無法訪問ClassB
的受保護/私有成員。 模板類共享一個通用名稱這一事實對他們來說並不重要。 ClassB<T>
和ClassB<U>
像對待完全不同的類一樣對待彼此,因此它們的成員彼此不可訪問。
當您意識到可以對模板化的類進行專門化時,其原因變得更加清楚,這意味着可以實現不具有名為a
的成員(或確實具有名為a
的成員,但以完全不同的方式使用它)的ClassB
實現。 ,因此不應訪問它)。
事實是ClassB<T>
和ClassB<U>
是不同的類(除非T = U
,但這通常不是正確的,因此編譯器不能依賴該假設)。 因此,他們不能互相訪問。
這是該語言的抽象功能。 就像兩個獨立的類一樣, ClassB<T>
和ClassB<U>
彼此對待,就像它們沒有關聯並且是不同的類一樣 ,因此它們無法訪問彼此的private
成員和protected
成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.