Nested friend class in nested template problem



 DEVELOP > c-Plus-Plus > Nested friend class in nested template problem

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: ""
Date: 07 Dec 2007 08:40:26 AM
Object: Nested friend class in nested template problem
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?
.

User: "Victor Bazarov"

Title: Re: Nested friend class in nested template problem 07 Dec 2007 08:50:48 AM
wrote:

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 };

Please don't post line numbers like you have here. It makes it
quite difficult to quickly copy-and-paste your code and compile it.
You can always use *comments* to identify the lines to which the
compiler is referring in its error messages.
Thanks.


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?

A buggy compiler?
Your code compiles OK in Comeau online (4.3.9) or VC++ 2005 SP1.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
.

User: "want.to.be.professer"

Title: Re: Nested friend class in nested template problem 07 Dec 2007 08:51:40 AM
On Dec 7, 10:40 pm,
wrote:

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.
.
User: "Victor Bazarov"

Title: Re: Nested friend class in nested template problem 07 Dec 2007 09:02:06 AM
want.to.be.professer wrote:

On Dec 7, 10:40 pm,

wrote:

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<T> makes '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
.



  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER