C++ 模板参数演绎,案例不清 类复印机{}; 模板 类析构函数{}; 模板 类BuildFactory:公共抽象器{}; 建筑厂屋宇署;
我无法理解模板参数C++ 模板参数演绎,案例不清 类复印机{}; 模板 类析构函数{}; 模板 类BuildFactory:公共抽象器{}; 建筑厂屋宇署;,c++,templates,C++,Templates,我无法理解模板参数t将被推断为什么。我怀疑T将被推断为Copier,但这只是我的想法,我无法解释。也许有人能解释一下这个话题。T没有任何推论。甚至没有必要。这一准则相当于: class Copier{ }; template<class T> class Destructor{ }; template<template<class T> class Abstractor> class BuildFactory : public Abstractor<
t
将被推断为什么。我怀疑T
将被推断为Copier
,但这只是我的想法,我无法解释。也许有人能解释一下这个话题。T
没有任何推论。甚至没有必要。这一准则相当于:
class Copier{ };
template<class T>
class Destructor{ };
template<template<class T> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
BuildFactory<Destructor> bd;
模板
类BuildFactory:公共抽象器{};
它只是意味着Abstractor
是一个类模板,也就是模板参数
通常,可选模板“参数”用于记录有关应使用的类模板的内容。正如前面的答案所述,这里没有推论。特别是,
被明确指定为Abstractor
析构函数
- 在
中,BuildFactory
与模板参数Abstractor
一起显式使用Copier
- 在
中,因为BuildFactory
是Abstractor
,它显式使用Destructor
Destructor
因为所有模板参数都是指定的,所以没有任何推断,甚至没有使用默认参数类型。没有推断。让我们看看
T
存在的两个地方:
template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
另一个代码:
template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
模板
类析构函数{};
建筑厂屋宇署;
同样,您传递的是模板析构函数
,而不是某个类析构函数
。不需要扣除
此外,无论如何,不可能推断类模板的模板参数:P@RSahu不,不是…@RSahu你为什么这么认为?我只是做了一个假设。@LightnessRacesinOrbit那么什么是正确的方法?@stella:你没有看到下面juanchopanza的答案吗?@LightnessRacesinOrbit是的,我可以。但我还有一个疑问。也许你可以看看它?是的,关键是传递的是一个模板,而不是一个类代码>BuildFactory模板正在隐式实例化,这导致析构函数模板也隐式实例化。如果不将模板参数推断为某种东西,模板怎么可能隐式实例化?@stella:“这导致析构函数模板也隐式实例化了”不正确。@LightnessRacesinOrbit可能是,但在这种情况下这并不重要。你觉得这个案子怎么样?@stella:同样的故事。有一件事你根本就误解了,如果你一直问同样的问题,我们就不知道那是什么!那么,如果我们删除基类规范呢<代码>析构函数仍将是
析构函数
@stella:使用析构函数
并不排除使用析构函数
。在您的新示例中,A
与C
参数一起显式使用,A
也与E
参数一起显式使用B
显式生成A=D
,因此您使用的是D
和D
,但所有参数仍然显式提供,没有演绎和默认值。是的,现在已经清楚了。我明白,这太让你吃惊了。不,Abstractor
没有显式实例化。它在第一个使用点被隐式实例化。不要混淆模板参数的显式说明和显式实例化。@BenVoigt:这是一个有趣的观点。事实上,说明这一点的一个好方法是删除bd
并添加charx[0]代码>到析构函数
。它可以很好地编译,尽管代码中显式地写了Abstractor
。@ChristianHackl:那么它根本就不是实例化的,不管是隐式的还是非隐式的。更好的方法是在单独的编译单元中给出一些越界成员函数定义。然后,析构函数的显式实例化将失败。隐式实例化将成功但不完整地编译,这要求如果这些成员函数实际被调用,则需要在它们存在的编译单元中再次实例化它们,或者遭受链接器故障。@BenVoigt出现在基类规范中是否会导致隐式模板插入?
template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
template<class T>
class Destructor{ };
BuildFactory<Destructor> bd;