class Foo
{
template <typename T> friend void T::persist(void);
int test;
};
class Bar
{
Foo foo;
void persist(void) { foo.test = 42; } // fails
}
有了这个,我希望每个定义它的类的persist()成员方法都是foo的朋友。奇怪的朋友行编译,但似乎什么都不做。
提前谢谢。
答案 0 :(得分:1)
你做不到。您不能与所有类型的成员成为朋友,并且您的模板 - 朋友声明格式错误。在:
中没有模板class Foo
{
template <typename T>
friend void T::persist(void);
int test;
};
请注意,朋友声明不是模板。您可以与模板函数或类成为,但上面的代码中没有它们。
一个简单的解决方法是创建一个辅助类,从中派生并提供访问器:
class Foo {
friend class FooAccessor;
int value;
};
class FooAccessor {
protected:
void write( Foo& f, int value ) {
f.value = value;
}
};
class FooUser : private FooAccessor {
Foo f;
void persist() {
write( f, 42 );
}
};
但是你可能想重新审视设计并寻找替代方案,请注意,创建字段private
然后允许其他所有类通过friend
声明访问它们并不比仅仅使用公共领域。如果你想解释你想要达到的目标,有人可能会帮助你。