Why internal struct template is accessible even if private?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 I tried is below (I tried with -ansi and -std=c++98).
--------cut here ---------
#include<iostream>
using namespace std;

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

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

class S0 {
private:
  struct I {
    static const 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------

Note: someone on comp.lang.c++ tested the code with Comeau C/C++ 4.3.10.1
(obviously after renaming it to ComeauTest.c) and received this error:

"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?
                                  ^


Who is right, and if it's g++ 4.4.5, how does it follow from the Standard that the code must compile?

Thanks in advance,
-Pavel





[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux