gpt4 book ai didi

c++ - 将类模板声明为类的友元

转载 作者:行者123 更新时间:2023-11-27 22:43:57 24 4
gpt4 key购买 nike

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

下面的例子给出了错误:

main.cpp:30:18: error: template argument required for ‘class Handle’
friend class Handle;
^
main.cpp:30:5: error: friend declaration does not name a class or function
friend class Handle;
^
main.cpp: In instantiation of ‘Handle<T>& Handle<T>::operator=(const Handle<T>&) [with T = Base]’:
main.cpp:42:7: required from here
main.cpp:33:19: error: ‘virtual Base* Base::clone() const’ is protected
virtual Base *clone() const { return new Base; }

使 Handle 成为 Base 的友元的正确表示法是什么?


#include <iostream>

template <class T>
class Handle
{
public:
Handle() : p(0) {}
Handle &operator=(const Handle &);
~Handle() { delete p; }

Handle(T *t) : p(t) {}

private:
T *p;
};

template <class T>
Handle<T> &Handle<T>::operator=(const Handle &rhs)
{
if (&rhs != this)
{
delete p;
p = rhs.p ? rhs.p->clone() : 0;
}
return *this;
};

class Base
{
friend class Handle; ///this fails

protected:
virtual Base *clone() const { return new Base; }

private:
int a;
};

main()
{
Handle<Base> h;
h = new Base;

return 0;
}

最佳答案

问题是 Handle 不是一个类;它是一个类模板。当你说 friend class Handle 时,它会寻找一些名为 Handle 的类,但找不到。

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

class Base
{
template <typename> friend class Handle;
// ...
};

这是你要求的,但我认为这不是你想要的。在你的例子中,你实际上不需要让 generic Handle 成为 Base 的 friend ,而只需要让特定的使用 基础。这可以通过以下方式实现:

class Base
{
friend class Handle<Base>;
// ...
};

关于c++ - 将类模板声明为类的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com