class Copier{ };
template<class T>
class Destructor{ };
template<template<class T> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
BuildFactory<Destructor> bd;
我无法理解模板参数T
将被推导出来的内容。我怀疑T
会被推断为Copier
,但它只是我的想法,我无法解释。也许有人可以解释这个话题。
答案 0 :(得分:6)
T
不会被推断为任何东西。甚至没有必要。这段代码是等价的:
template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
这只意味着Abstractor
是一个类模板,以及所谓的模板模板参数。
通常,可选模板“参数”用于记录应该使用的类模板。
答案 1 :(得分:2)
正如先前的答案所说,这里没有任何演绎。特别是,
Abstractor
明确指定为Destructor
。BuildFactory
中,Abstractor
明确用于Copier
的模板参数。BuildFactory<Destructor>
中,由于Abstractor
为Destructor
,因此明确使用Destructor<T = Copier>
。因为指定了所有模板参数,所以没有推论,甚至没有使用默认参数类型。
答案 2 :(得分:2)
没有扣除。让我们看一下T
存在的两个地方:
template<template<class T> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
这表示BuildFactory
是一个类模板,它本身采用类模板,称之为Abstractor
。同样,要明确:Abstractor
是一个类模板,而不是实例化。所以根本没有扣除。当您Abstractor<Copier>
命名时,班级Copier
会有明确的参数。
T
实际上没有必要;你可以写:
template<template<class> class Abstractor>
class BuildFactory : public Abstractor<Copier>{ };
现在换另一个代码:
template<class T>
class Destructor{ };
BuildFactory<Destructor> bd;
同样,您传递的是模板Destructor
,而不是某些类Destructor<T>
。不需要扣除。
此外,无论如何,无法推断出类模板的模板参数。 :P