我正在尝试按照 Moo 和 Kernig 的Accelerated C++(第 257-257 页)构建一个通用句柄类。但是,为了调用clone
基类的函数,我需要创建通用的Handle
类 a friend
of Base
。
下面的例子给了我错误:
\n\nmain.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\nHandle
交朋友的正确表达方式是什么Base
?
#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
问题是这Handle
不是一个类;而是一个类。它是一个类模板。当您说 时friend class Handle
,它会查找某个名为 的类Handle
,但找不到。
使模板的每个friend
成员成为 a 的正确语法是将声明设为friend
模板:
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
。这可以通过以下方式完成:
class Base\n{\n friend class Handle<Base>;\n // ...\n};\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
3536 次 |
最近记录: |