c++模板内部模板调用
c++ templates inside template call
关于c++模板机制的一个小问题。假设我们有一个名为Point的类。现在假设"Data"是一个模板类/容器,只包含T(模板)数据成员。也就是说,"Data"或多或少是这样的:
Template <class T>
class Data {
T dMember;
……..
};
现在假设有人在main.cpp文件中使用了这个类,并预先做了以下声明:
Data<Data<Point>> d;
我试图完全理解创建的对象是什么样子的。我试图使用编译器进入类调用,但无济于事。我知道Data需要初始化Data所以它调用自己一次,但它真正做什么呢?是否有一个构造函数被激活?
谢谢你,家伙
它就像在下面的例子中实例化Data2
:
class Data1 {
Point dMember;
};
class Data2 {
Data1 dMember;
};
Data2 d; // = Data<Data<Point>> d;
基本上是Point
的换行
我知道Data需要初始化Data,所以它调用自己一次,但它真正做什么呢?是否有一个构造函数被激活?
数据并不真正调用自己一次。这是因为内部数据和外部数据是两个不同的类。一般情况下,如果编译器看到Data<Data<Point>>
,它首先识别内部部分,即Data<Point>
。然后,它将实例化模板,这意味着它创建了一个具有模板描述的属性的类。重要的是要认识到Data不是一个类,而是一个可用于创建一大堆类的模板。每一个类都是不同的,它们是不同的类型,彼此之间没有真正的联系。所以Data<Point>
只是模板的一个实例化,它是一个具有相同属性的类,比如
class Foo {
Point dMember;
...
};
我就叫它Foo。然后编译器看到Data<Data<Point>>
,也可以是Data<Foo>
。它再次实例化模板,这次使用Foo(即从第一次实例化中获得的类)作为参数。它获得另一个类,原则上完全独立于第一个类,除了它具有第一个实例化类型的成员:
class Bar {
Foo dMember;
...
};
这一切。Data不调用自己,Data甚至不作为类型存在。在初始化中调用的构造函数是Bar的构造函数,而Bar的构造函数又会调用Foo的构造函数。在Data中定义的构造函数不是真正的构造函数,因为类模板中的任何东西本身都是模板。它是一个构造函数模板,如果你调用Foo和/或Bar的构造函数,编译器会使用那个模板来实例化实际的构造函数。
Data只是编译器构建真正的类(如果需要的话,还有成员函数)的蓝图,它永远不会在那里播放或调用或初始化任何东西。
Point>应该是:
class Data<Point> {
Point dMember;
...
};
Data
class Data<Data<Point>> {
Data<Point> dMember;
...
};
第二个,Data
如果Data
- join() 失败,如果在线程内部调用 io_context.run()
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- OpenMP 内部的函数调用用于循环
- std::使用内部对象移动 - 与调用不匹配
- 从动态加载的 dll 内部调用C++函数
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 如何在JNI中从线程内部调用JAVA方法
- 正确的方法是什么?调用指针到指针到指针内部的函数?
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- COUT 内部函数调用的顺序
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 仅执行一次函数一次内部循环,该循环在每个0.1秒C 处都被调用
- C++ While(1) 循环内部没有调用 if 语句
- C++ ld 链接器 --wrap 选项不适用于内部函数调用
- 在成员函数内部调用成员函数
- 从系统调用内部生成调用堆栈
- 干净编码:如何从循环中的函数调用内部中断循环
- 调用内部虚拟函数的c++函数
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效