http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53116
Bug #: 53116
Summary: protected member access from derived template
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: [email protected]
ReportedBy: [email protected]
According to "11.4 Protected member access" part of C++11 standard, member
function of derived class has no access to protected member of base class
through pointer to member class. In example below, we have base class "B",
derived classes D and Di. Either of them has access to B::f() through "this",
it is OK. D has not access through "B *" pointer, it is OK. But Di has access
through "B *" and it is a bug. The only difference between D and Di that Di is
template class.
I have tested it with "template <typename T>" template declaration, behavior is
the same.
Example:
class B
{
protected:
void f();
};
class D: public B
{
public:
void k()
{
f(); // this->f(), no error, OK
//static_cast<B *>(0)->f(); // error here, OK
}
};
template <int size>
class Di: public B
{
public:
void k()
{
f(); // this->f(), no error, OK
static_cast<B *>(0)->f(); // no error here, BUG
}
private:
int m_field[size];
};
int main() {}