gpt4 book ai didi

c++ - 为什么模板类的成员需要通过其模板类的参数进行参数化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:33 25 4
gpt4 key购买 nike

在 Stroustrup 的书(第 4 版 - 首次打印)的第 668 页,您会找到以下模板类示例吗?

template<typename C>
class String{
public:
String();
...
private:
int sz;
C* ptr;
};

作者在第 679 页写道:

Members of a template class are themselves templates parameterized by the parameters of their template class. When such a member is defined outside its class, it must explicitly be declared as template. For example:

template<typename C>
String<C>::String()
:sz(0), ptr(ch)
{
ch[0] = {};
}

这个例子有一个明显的错误。上面的变量 ch 没有任何意义。但这与我的问题无关。我想知道的是为什么上面的构造函数不能定义没有参数C,如下所示?

template<typename C>
String::String()
: sz(0), ptr(nullptr)
{
}

最佳答案

String是模板的名称,而不是类。模板甚至不是类型,因此它没有成员。然而,模板特化是一个类。您需要插入 C为了具体说明您在本定义中指的是哪个专业。

现在碰巧定义本身是一个模板,但那是因为您正在为一系列特化定义事物。然而,事实仍然是您需要明确命名这些特化。

最后,您只需要指定一次特化的原因是模板名称在类模板特化范围内以特殊方式处理。在该范围内,模板名称指的是注入(inject)的类名,指的是特化本身。这就是为什么

template<typename C>
String<C>::String<C>()
:sz(0), ptr(ch)
{
}

...可以写成...

template<typename C>
String<C>::String()
:sz(0), ptr(ch)
{
}

String<C>已经建立了我们所指的特化,并且我们在其范围内,我们可以使用 String具有作为注入(inject)类名的特殊含义。

关于c++ - 为什么模板类的成员需要通过其模板类的参数进行参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51539021/

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