来自Johannes Schaub - 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 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机制
发布于 2012-10-21 06:40:51
这是合法的,因为朋友函数总是在全局作用域中,即使你在一个类中实现它们。换句话说,这就是:
class A
{
friend void go() {}
};
只是一个快捷方式:
class A
{
friend void go();
};
void go() {}
发布于 2012-10-21 12:08:34
这是gcc中的一个已知编译器错误,已在以后的版本中修复。请参见-:
https://stackoverflow.com/questions/12993219
复制相似问题