从非成员模板函数访问私有内部类类型

时间:2015-02-18 23:53:23

标签: c++ templates private inner-classes

请考虑以下代码:

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

我如何能够在非成员函数Outer::Inner中使用类型为func2的参数,这是一种私有类型?当我尝试使用以下错误消息时,func1正确地抱怨:

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) {
               ^

我在ubuntu上使用g ++ 4.8.2,但我也在gcc-4.9.2上看到了这一点(在www.ideone.com上)

您可以在此处试用代码:Ideone

1 个答案:

答案 0 :(得分:1)

我得到了

  

错误1错误C2248:&#39; Outer :: Inner&#39; :无法访问在类&#39;外部&#39;中声明的私有结构。

使用Visual Studio 2013更新4.问题,这是编译器中的一个问题。