want.to.be.professer wrote:
Quote:
On Dec 7, 10:40 pm, tonvandenheu...@gmail.com wrote:
Quote:
>Hi all,
>>
>the following code does not compile in gcc 4.0.2:
>>
> 3 class Outer
> 4 {
> 5 class B;
> 6
> 7 template<typename T>
> 8 class A
> 9 {
> 10 friend class Outer::B;
> 11
> 12 public:
> 13 A(T t): a(t) { };
> 14 A() { };
> 15 protected:
> 16 T a;
> 17 };
> 18
> 19 class B : public A<int>
> 20 {
> 21 public:
> 22 B(A<int& a)
> 23 {
> 24 b = a.a;
> 25 }
> 26
> 27 int b;
> 28 };
> 29 };
>>
>The error I get is:
>>
>friend.cpp: In constructor 'Outer::B::B(Outer::A<int>&)':
>friend.cpp:16: error: 'int Outer::A<int>::a' is protected
>friend.cpp:24: error: within this context
>>
>Note that when the Outer class is stripped, everything compiles just
>fine. What is the problem here?
>
Note the error message:'int Outer::A<int>::a' is protected.
>
B is inherited form A as public inheritance,
So B can only call A's public and private members.
Actually your post made me think a bit more about this, and perhaps
I was too fast to judge GCC as buggy...
Usually the rule is, the derived class is not alloed to access
*another instance's protected members*, but only its own or of
another instace of _its own type_. IOW, you should get an error
in 'foo', but not in 'bar':
class A {
protected:
int a;
};
class B : A {
void foo(A& a) {
a.a; /// error!
}
void bar() {
this->a; // OK
}
};
However, in this particular case, since A<Tmakes 'B' its
friend, all the rules about protected access are overridden by
the rules of friendship, which allows access to _all_ members
regardless of their declared access specifiers.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask