簡體   English   中英

為什么從模板方法無法訪問此類自己的受保護成員?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM