![](/img/trans.png)
[英]C++: “specializing” a member function template to work for derived classes from a certain base class
[英]C++ keeping access to protected member (of the function argument) when specializing base template class
任何人都可以幫助解決此問題(該問題在GCC和VC ++中均持續存在)。
template <class T> class A{
protected:
T a;
public:
A(int aa=0){a=aa;}
virtual ~A(){}
virtual void plus(A const *AA){a=a+AA.a;}
};
class B:public A<int>{
public:
B(int bb=0):A<int>(bb){}
virtual ~B(){}
void plus(A<int> const *AA){a=a+AA->a;} //<--PROBLEM: I can access a but not AA->A?
};
這是預料之中的。
B的實例無權戳入任意 A的內部; 它僅有權訪問(其他)B的A部分。 這就是protected關鍵字的含義。
這不是編譯器的問題,而是標准的一致行為。 您只能通過this
(隱式或顯式)訪問基類的受保護成員。
看起來應該像這樣:
class B:public A<int>{
public:
B(int bb=0):A<int>(bb){}
virtual ~B(){}
void plus(A<int> const *AA){this->A::plus(AA);}
};
如果這樣做,則無需在派生類中重新實現plus函數。
“ UncleBens”已經回答了您的主要問題,但有一些詳細信息...
第一:
virtual void plus(A const *AA){a=a+AA.a;}
由於AA
是一個指針,因此您無法執行AA.a
... ;-)
其次,請注意,成員指針通常不尊重可訪問性。 僅使用隱式轉換,您就可以訪問基類的受保護內容。 成員指針的可訪問性與流控制的goto
幾乎相同。
干杯,……
–阿爾夫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.