提问者:小点点

声明好友模板函数


本题部分基于加速C++[1]中的练习15-4和那本书中的代码。我想将myclone函数声明为类的朋友,以便它能够访问私有成员。myclone函数被声明为模板,但我不想让所有可能的函数访问私有成员,只允许那些与该类关联的函数访问。

class A{
    template <class T>
    friend T* myclone(const T*);

    A* clone() const {return new A(*this);}
}

其他文件:

template <class T>
T* myclone(const T* t) {return t->clone();}

另一个假设的myclone函数可以调用a对象的clone方法,但我希望限制对a*myclone(const a*)的私有访问。有没有办法做到这一点,还是我想多了,这种情况在实践中永远不会发生?我应该使用模板专门化吗?

[1]Koenig,A.和Moo,B.E.(2000年)。通过实例加速C++实用编程。皮尔森。


共1个答案

匿名用户

你不能只让朋友接触你的一些隐私。这是一件要么全有要么全无的事情。

朋友a*myclone(const a*);不工作,因为没有这样的函数。模板不是那个函数,它的任何专门化也不是。如果你想和一个特殊的专业做朋友,就这么说:

template <class T> T* myclone(const T*); // needs to be declared first

class A {
   friend A* myclone<A>(const A*);
   ...