当前位置: 首页 > 知识库问答 >
问题:

声明好友模板函数

宋博易
2023-03-14

本题部分基于加速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个答案

龙默
2023-03-14

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

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

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

class A {
   friend A* myclone<A>(const A*);
   ...
 类似资料:
  • 我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相

  • 我有一个全局函数是这样的: 然后在另一个类中,我要将这个函数声明为的朋友。所以我做了: 现在,当我调用时,它无法编译,错误是foo无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。

  • 我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:

  • 模板特化可以被显式声明,这可以作为消除多重实例化的一种方式。例如: #include "MyVector.h" extern template class MyVector<int>; // 消除下面的隐式实例化 // MyVector 类将在“其他地方”被程序员显式实例化 void foo(MyVector<int>& v) { //在这个地方使用vector类型 } 下列代码就是上例

  • 我试图使乘法运算符成为名为TVector3的模板类的朋友。我读过,我可以在类声明中声明朋友函数之前,对其进行前向声明,但我这样做的尝试是徒劳的。我知道我可以简单地定义friend函数而不是声明它,但我希望它能与前向声明技术一起工作。 特别是,我试图为我的案例实施这个解决方案。我发现这篇文章也是David Rodriguez给出的解决方案(第三个版本),但我不知道我做错了什么。 我使用'g temp