首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用模板技巧访问私有成员

使用模板技巧访问私有成员
EN

Stack Overflow用户
提问于 2012-10-21 06:21:39
回答 2查看 4K关注 0票数 18

来自Johannes Schaub - litb的一篇博客文章

代码语言:javascript
复制
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 struct Rob<A_f, &A::a>;

int main() {
  A a(42);
  std::cout << "proof: " << a.*get(A_f()) << std::endl;
}

既然get函数没有在class A中定义,那么如何从a对象调用它呢?

编辑:

我不明白为什么get必须有标记作为参数,而不是a.*get<A_f>() => ok,这是由于ADL机制

EN

回答 2

Stack Overflow用户

发布于 2012-10-21 06:40:51

这是合法的,因为朋友函数总是在全局作用域中,即使你在一个类中实现它们。换句话说,这就是:

代码语言:javascript
复制
class A
{
    friend void go() {}
};

只是一个快捷方式:

代码语言:javascript
复制
class A
{
    friend void go();
};

void go() {}
票数 1
EN

Stack Overflow用户

发布于 2012-10-21 12:08:34

这是gcc中的一个已知编译器错误,已在以后的版本中修复。请参见-:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41437

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12993219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档