c++ - 模板特化和从其他模板类继承模板类

标签 c++ templates inheritance specialization

我对下一个代码有一些疑问:

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)> {

};
  1. 类(class)特化Derived<T(P)>继承自类template<typename T> class Base或来自类 template<typename T, typename P> class Base<T(P)>

  2. 我绑定(bind)模板参数时的名称是什么TP类(class)专业Derived<T(P)>带模板参数Tclass Base .

最佳答案

  1. Class specialization Derived<T(P)> inherits from class template<typename T> class Base or from class template<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 的每个特化时,对每个特定的模板参数集独立地生成平均值。已实例化。

  1. What the name of when I'm binding template parameters T and P of class specialization Derived<T(P)> with template parameter T of class Base.

除了您使用的是依赖复合类型之外,我不知道任何术语。 (Dependent = 取决于一个或多个模板参数;Compound = 类型 T(P) 涉及其他类型 TP 。)这也使得 Base<T(P)> Derived<T(P)> 定义中的依赖基类,这意味着编译器不会在那里查找普通标识符,您需要使用 this->nameBase::name使这些名称有效。同样重要的是,模板参数位于特化模板参数内的“可推论上下文”中。

关于c++ - 模板特化和从其他模板类继承模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368183/

相关文章:

c++ - std::array 使用 Visual Studio 2010 初始化

javascript - 聆听 Handlebars 渲染

c++ - 允许派生类访问,但不允许覆盖

wpf - 通用类型 XAML 2009

sql - 有关继承和外键引用的数据库设计查询

c++ - 使用着色器渲染时 OpenGL 纹理全黑

c++ - i = i + 1 和++i 之间的速度比较

javascript - 如何在 firefox/chrome javascript 插件中存储数据和添加按钮

c++ - 编译器以获得更好的模板支持

c++ - enable_if 结构体定义和默认模板参数