相关疑难解决方法(0)

为什么我可以在私有类型上使用auto?

以下代码编译并运行时,我感到很惊讶(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在私有类型上使用,而我不能使用它的名字(如预期的那样)?

c++ private-members auto c++11

134
推荐指数
4
解决办法
4172
查看次数

允许访问私人会员

这个问题是有点的延续这一个我已经张贴.

我试图做的是:我的观点是允许访问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)

c++ inheritance templates private class

5
推荐指数
1
解决办法
1477
查看次数

标签 统计

c++ ×2

auto ×1

c++11 ×1

class ×1

inheritance ×1

private ×1

private-members ×1

templates ×1