以下代码编译并运行时,我感到很惊讶(vc2012&gcc4.7.2)
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得好吗?为什么这是正确的?为什么我可以auto在私有类型上使用,而我不能使用它的名字(如预期的那样)?
这个问题是有点的延续这一个我已经张贴.
我试图做的是:我的观点是允许访问A派生类中基类的私有成员B,具有以下限制:
std::map<>实际上 - ,而不是一个方法;A没有模板化方法我可能会作为后门替代方法重载 - 我不会添加这样的方法,因为它会违反第二个约束.作为一种可能的解决方案,我已经指出了litb的解决方案(帖子/博客),但是,对于我的生活,我无法就这些帖子中的内容达成一致,因此,我可以没有得到我的问题的解决方案.
我要做的是:以下代码,来自litb的解决方案,介绍了如何从类/结构访问私有成员的方法,它恰好涵盖了我提到的限制.
所以,我正在尝试重新排列这一个代码:
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template …Run Code Online (Sandbox Code Playgroud)