将类模板声明为类的友元

Bil*_*ean 2 c++ oop templates

我正在尝试按照 Moo 和 Kernig 的Accelerated C++(第 257-257 页)构建一个通用句柄类。但是,为了调用clone基类的函数,我需要创建通用的Handle类 a friendof Base

\n\n

下面的例子给了我错误:

\n\n
main.cpp:30:18: error: template argument required for \xe2\x80\x98class Handle\xe2\x80\x99\n     friend class Handle;\n                  ^\nmain.cpp:30:5: error: friend declaration does not name a class or function\n     friend class Handle;\n     ^\nmain.cpp: In instantiation of \xe2\x80\x98Handle<T>& Handle<T>::operator=(const Handle<T>&) [with T = Base]\xe2\x80\x99:\nmain.cpp:42:7:   required from here\nmain.cpp:33:19: error: \xe2\x80\x98virtual Base* Base::clone() const\xe2\x80\x99 is protected\n     virtual Base *clone() const { return new Base; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

Handle交朋友的正确表达方式是什么Base

\n\n
\n\n
#include <iostream>\n\ntemplate <class T>\nclass Handle\n{\n  public:\n    Handle() : p(0) {}\n    Handle &operator=(const Handle &);\n    ~Handle() { delete p; }\n\n    Handle(T *t) : p(t) {}\n\n  private:\n    T *p;\n};\n\ntemplate <class T>\nHandle<T> &Handle<T>::operator=(const Handle &rhs)\n{\n    if (&rhs != this)\n    {\n        delete p;\n        p = rhs.p ? rhs.p->clone() : 0;\n    }\n    return *this;\n};\n\nclass Base\n{\n    friend class Handle; ///this fails\n\n  protected:\n    virtual Base *clone() const { return new Base; }\n\n  private:\n    int a;\n};\n\nmain()\n{\n    Handle<Base> h;\n    h = new Base;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*l H 6

问题是这Handle不是一个类;而是一个类。它是一个类模板。当您说 时friend class Handle,它会查找某个名为 的类Handle,但找不到。

\n\n

使模板的每个friend成员成为 a 的正确语法是将声明设为friend模板:

\n\n
class Base\n{\n    template <typename> friend class Handle;\n    // ...\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是你所要求的,但我不认为\xe2\x80\x99是你想要的。根据您的示例,您实际上不需要将泛型 Handle设为的友元Base,而只需要使用特定的友元Base。这可以通过以下方式完成:

\n\n
class Base\n{\n    friend class Handle<Base>;\n    // ...\n};\n
Run Code Online (Sandbox Code Playgroud)\n