2012-04-10 14 views
2

Warum ist eine abgeleitete Klasse nicht berechtigt, auf ihr geschütztes Basisklassenmitglied zuzugreifen, wenn sie templatesiert?C++ Template-Parameter als Basisklasse

class MyBase { 
protected: 
    int foo; 
}; 

template<typename Impl> 
class Derived : public Impl { 
public: 
    int getfoo() { 
      return static_cast<Impl*>(this)->foo; 
    } 
}; 

Der Compiler beschwert foo geschützt ist. Warum?

error: int MyBase::foo is protected 

Antwort

11

Sie greifen foo durch einen MyBase* anstelle eines Derived<MyBase>*. Sie können auf geschützte Elemente nur über Ihren eigenen Typ und nicht über den Basistyp zugreifen.

Versuchen Sie stattdessen:

int getfoo() { 
     return this->foo; 
} 

Aus dem C++ 2003-Standard, 11,5/1 [class.protected]: „Wenn ein Freund oder eine Elementfunktion einer abgeleiteten Klasse einer geschützte nicht-statische Member-Funktion oder geschützt nicht statisches Datenelement referenziert einer Basisklasse ... der Zugriff muss über einen Zeiger auf, Verweis auf oder Objekt der abgeleiteten Klasse selbst (oder einer von dieser Klasse abgeleiteten Klasse) erfolgen "

+0

... oder' return Impl :: foo; ' . –

+0

oder zurück foo; // ein unnötiger Kommentar, um meinen Kommentar lang genug zu machen, damit ich ihn mit stackoverflow schreiben kann. –

+2

'Return foo;' funktioniert definitiv nicht. –

Verwandte Themen