非常重要的模板朋友声明

时间:2012-03-19 23:45:11

标签: c++ templates friend

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的朋友。奇怪的朋友行编译,但似乎什么都不做。

提前谢谢。

1 个答案:

答案 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声明访问它们并不比仅仅使用公共领域。如果你想解释你想要达到的目标,有人可能会帮助你。