我有一些关于下一个代码的问题:
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)> {
};
Derived<T(P)>
在将类专门化Derived<T(P)>
的模板参数T
和P
与class Base
.的模板参数T
绑定时,从类template<typename T> class Base
或类template<typename T, typename P> class Base<T(P)>
发布于 2019-05-30 05:28:36
Derived<T(P)>
实例化的类继承自Base<T(P)>
实例化的类。由于类型继承与您的Base
部分专门化相匹配,因此该模板将用于实例化要继承的类。T(P)
类型实例化了模板Base
并继承了结果类。当Derived<T(P)>
被实例化时,Base<T(P)>
将被实例化,因此Derived<void(int)>
继承自Base<void(int)>
。这两个实例化都将经历相同的规则集,以确定使用哪个模板来实例化该类。
你可能会认为T(P)
是某种特殊的模板,你可能会感到困惑。事实并非如此。它只是“返回T
并接受P
类型的单个参数的函数”类型。诚然,这样的类型在模板之外不会出现太多,但在其他地方它们是完全合法的。即
using FuncType = void(int);
// These two declarations are exactly the same
void doAThing(FuncType* callback);
void doAThing(void(*callback)(int));
https://stackoverflow.com/questions/56368183
复制相似问题