【问题标题】:c++ templates inside template call模板调用中的c ++模板
【发布时间】:2013-01-15 21:02:39
【问题描述】:

关于 c++ 模板机制的一个小问题。假设我们有一个名为 Point 的类。现在假设“数据”是一个模板类/容器,只包含 T(模板)数据成员。 也就是说,“数据”看起来或多或少是这样的:

Template <class T>
class Data {
T dMember;
……..
};

现在假设有人在 main.cpp 文件中使用这个类并执行以下声明:

Data<Data<Point>> d;

我试图完全了解创建的对象的外观。我试图使用编译器进入课堂通话,但无济于事。我知道 Data 需要初始化 Data 所以它会调用自己一次,但它在那里真正做了什么?是否有构造函数被激活?

谢谢你, 伙计

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    这就像在以下示例中实例化 Data2

    class Data1 {
        Point dMember;
    };
    
    class Data2 {
        Data1 dMember;
    };
    
    Data2 d; // = Data<Data<Point>> d;
    

    基本上是Point的一个换行。

    【讨论】:

      【解决方案2】:

      我知道 Data 需要初始化 Data 以便它调用自己一次,但它在那里真正做了什么?是否有构造函数被激活?

      数据并没有真正调用它一次。这是因为内部数据和外部数据是两个不同的类。一般来说,如果编译器看到Data&lt;Data&lt;Point&gt;&gt;,它首先会识别出内部部分,即Data&lt;Point&gt;。然后它实例化模板,这意味着它创建了一个具有模板描述的属性的类。重要的是要意识到 Data 不是一个类,而是一个可用于创建一大堆类的模板。这些类中的每一个都与其他类不同,它们是不同的类型,彼此之间没有真正的关系。所以Data&lt;Point&gt; 只是模板的一个实例,它是一个具有相同属性的类,例如,

      class Foo {
        Point dMember;
        ...
      };
      

      我就叫它Foo。然后编译器看到Data&lt;Data&lt;Point&gt;&gt;,也可能是Data&lt;Foo&gt;。它再次实例化模板,这次使用 Foo(即它从第一次实例化得到的类)作为参数。它得到另一个类,原则上完全独立于第一个类,除了它具有第一个实例化类型的成员:

      class Bar {
        Foo dMember;
        ...
      };
      

      仅此而已。数据不调用自身,数据甚至不作为一种类型存在。初始化中调用的构造函数是 Bar 的构造函数,而 Bar 的构造函数又会调用 Foo 的构造函数。您在 Data 中定义的构造函数不是真正的构造函数,因为位于类模板中的任何东西都是模板本身。所以它是一个构造函数模板,如果你调用 Foo 和/或 Bar 的构造函数,编译器会使用该模板来实例化实际的构造函数。

      数据只是编译器构建真实类(和成员函数,如果需要)的蓝图,它永远不会在那里播放或调用或初始化任何东西。

      【讨论】:

        【解决方案3】:

        Data 的模板是:

        class Data<Point> {
          Point dMember;
          ...
        };
        

        Data> 的模板是:

        class Data<Data<Point>> {
          Data<Point> dMember;
          ...
        };
        

        在第二个中,Data 用作任何其他成员变量。

        如果Data有构造函数,它会被调用两次。首先是 Data 因为它是一个成员变量,并且首先调用它们的构造函数。然后为数据>。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多