Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数演绎,案例不清 类复印机{}; 模板 类析构函数{}; 模板 类BuildFactory:公共抽象器{}; 建筑厂屋宇署;_C++_Templates - Fatal编程技术网

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;