Access to a private internal class type from a function that is not a member of the template

Consider the following code:

#include <iostream>
using namespace std;

class Outer {
    struct Inner {
        int num;    
    };

public:
 static Inner GetInner() {
    return Inner{-101};
}
};

// void func1(Outer::Inner inner) {  // [1] Does not compile as expected
//  cout << inner.num <<endl;
//}

template <typename Dummy>
void func2(Outer::Inner inner, Dummy = Dummy()) {
    cout << inner.num << endl;
}


int main() {
    // func1(Outer::GetInner()); // [2] does not compile as expected 
    func2<int>(Outer::GetInner()); // [3] How does this compile? 
                                   // Outer::Inner should not be accessible
                                   // from outside Outer
    return 0;
}

How can I use a type argument Outer::Inner, which is a private type, in a function that is not a member func2? ' func1rightly complains when I try to use it with the following error message:

prog.cpp: In function 'void func1(Outer::Inner)':
prog.cpp:5:9: error: 'struct Outer::Inner' is private
  struct Inner {
         ^
prog.cpp:15:19: error: within this context
 void func1(Outer::Inner inner) {
               ^

I am using g ++ 4.8.2 on ubuntu, but I also see this on gcc-4.9.2 (at www.ideone.com)

You can try the code here: Ideone

+4
source share
1 answer

I get

1 C2248: "Outer:: Inner": , "Outer"

Visual Studio 2013 4. Ergo, .

+1

All Articles