Why internal struct template is accessible even if private?

P

Pavel

Hi,

I have seen that with the new compilers (last tried with g++ 4.4.5) nested
struct templates are accessible from outside even when declared in the "private"
section of a class but with older ones (like g++ 3.xx) they were not. I suspect
new compilers are right but cannot trace it to the Standard -- any hints if it
is the right behavior and how it follows from the Standard? The code is below:

--------cut here ---------
#include <iostream>
using namespace std;

class S {
private:
template <typename T>
struct I
{
const static T i;
};
};

template <>
const int S::I<int>::i = 5;

class S0 {
private:
struct I {
const static int i;
};
};

const int S0::I::i = 6;

int main(int, char *[]) {
cout << "S::I<int>::i=" << S::I<int>::i << endl; // why does this compile?
// cout << "S0::I::i=" << S0::I::i << endl; // this would not not compile, as
expected, with this error msg (g++ 4.4.5):
// tic.cpp:18: error: ‘struct S0::I’ is private
// tic.cpp:28: error: within this context
return 0;
}
----------cut here------

Thanks in advance,
-Pavel
 
A

Alf P. Steinbach /Usenet

* Pavel, on 01.05.2011 01:03:
#include <iostream>
using namespace std;

class S {
private:
template <typename T>
struct I
{
const static T i;
};
};

template <>
const int S::I<int>::i = 5;

class S0 {
private:
struct I {
const static int i;
};
};

const int S0::I::i = 6;

int main(int, char *[]) {
cout << "S::I<int>::i=" << S::I<int>::i << endl; // why does this compile?
// cout << "S0::I::i=" << S0::I::i << endl; // this would not not compile, as
expected, with this error msg (g++ 4.4.5):
// tic.cpp:18: error: ‘struct S0::I’ is private
// tic.cpp:28: error: within this context
return 0;
}

perhaps you forgot to use proper options to make compilers conforming

<comeau>
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 9: warning: storage class is not first
const static T i;
^

"ComeauTest.c", line 19: warning: storage class is not first
const static int i;
^

"ComeauTest.c", line 26: error: class template "S::I" (declared at line 7) is
inaccessible
cout << "S::I<int>::i=" << S::I<int>::i << endl; //why does this compile?
^

1 error detected in the compilation of "ComeauTest.c".
</comeau>


cheers & hth.,

- Alf
 
P

Pavel

Alf said:
* Pavel, on 01.05.2011 01:03:
#include <iostream>
using namespace std;

class S {
private:
template <typename T>
struct I
{
const static T i;
};
};

template <>
const int S::I<int>::i = 5;

class S0 {
private:
struct I {
const static int i;
};
};

const int S0::I::i = 6;

int main(int, char *[]) {
cout << "S::I<int>::i=" << S::I<int>::i << endl; // why does this
compile?
// cout << "S0::I::i=" << S0::I::i << endl; // this would not not
compile, as
expected, with this error msg (g++ 4.4.5):
// tic.cpp:18: error: ‘struct S0::I’ is private
// tic.cpp:28: error: within this context
return 0;
}

perhaps you forgot to use proper options to make compilers conforming

<comeau>
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 9: warning: storage class is not first
const static T i;
^

"ComeauTest.c", line 19: warning: storage class is not first
const static int i;
^

"ComeauTest.c", line 26: error: class template "S::I" (declared at line
7) is
inaccessible
cout << "S::I<int>::i=" << S::I<int>::i << endl; //why does this compile?
^

1 error detected in the compilation of "ComeauTest.c".
</comeau>
Thanks Alf!

First I forgot but now I tried it with -ansi and -std=c++98 which both stand for
"The 1998 ISO C++ standard plus amendments" and it still compiles. Now that I
know Comeau does not like it, I will take it with gnu.g++.bug.

If other people could try it with their compilers and report the results I would
appreciate that.

-Pavel
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top