我对下一个代码有一些疑问:
template<typename T>
class Base;
template<typename T, typename P>
class Base<T(P)> {
};
template<typename T>
class Derived;
template<typename T, typename P>
class Derived<T(P)> : public Base<T(P)> {
};
类(class)特化
Derived<T(P)>
继承自类template<typename T> class Base
或来自类template<typename T, typename P> class Base<T(P)>
?我绑定(bind)模板参数时的名称是什么
T
和P
类(class)专业Derived<T(P)>
带模板参数T
的class Base
.
最佳答案
- Class specialization
Derived<T(P)>
inherits from classtemplate<typename T> class Base
or from classtemplate<typename T, typename P> class Base<T(P)>
?
从技术上讲,两者都不是。类或类模板永远不会从模板继承,而只会从一种特定的基类类型继承。即Derived<int(float&)>
继承Base<int(float&)>
, 等等。该基类从与 Base
关联的最专业的声明中实例化。对于那些特定类型。如果有额外的部分特化或显式特化,这种区别的重要性就会显现出来。
如果我稍微改变一下你的例子,
template<typename T> // #1
class Base;
template<typename T, typename P> // #2
class Base<T(P)> {
public:
static const int mem1 = 1;
};
template<typename T>
class Derived;
template<typename T, typename P>
class Derived<T(P)> : public Base<T(P)> {
};
class SomethingElse {};
template<typename P> // #3
class Base<SomethingElse(const P&)> {
public:
static const long long mem2 = 2;
};
using ThingType = Derived<SomethingElse(const std::string&)>;
const auto A = ThingType::mem1; // Error!
const auto B = ThingType::mem2; // OK
说部分特化 Derived<T(P)>
是不正确的继承部分特化Base<T(P)>
,因为示例类型为 Derived<SomethingElse(const std::string&)>
使用Derived
部分特化,但不使用 Base
完全部分特化。 Base<T(P)>
只表示名为 Base
的模板,具有 Base
的任何特化定义最适合模板参数 T(P)
。决定什么是基类Base<T(P)>
当 Derived
的每个特化时,对每个特定的模板参数集独立地生成平均值。已实例化。
- What the name of when I'm binding template parameters
T
andP
of class specializationDerived<T(P)>
with template parameterT
of class Base.
除了您使用的是依赖复合类型之外,我不知道任何术语。 (Dependent = 取决于一个或多个模板参数;Compound = 类型 T(P)
涉及其他类型 T
和 P
。)这也使得 Base<T(P)>
Derived<T(P)>
定义中的依赖基类,这意味着编译器不会在那里查找普通标识符,您需要使用 this->name
或Base::name
使这些名称有效。同样重要的是,模板参数位于特化模板参数内的“可推论上下文”中。
关于c++ - 模板特化和从其他模板类继承模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368183/