|
|
1
32
不管T是什么,一个std::vector实例都有一个固定的大小,因为它只包含一个指向T的指针,正如其他人之前所说的那样。但是vector的构造函数取决于具体的类型。您的示例无法编译,因为A()尝试调用向量的ctor,而在不知道B的情况下无法生成ctor。下面是可行的方法: A.秘书长的声明:
A.执行情况:
现在,a的用户只需要知道a,而不需要知道B:
|
|
|
2
31
编译器需要知道“B”有多大才能生成适当的布局信息。如果相反,你说
|
|
|
3
5
|
|
|
4
3
需要的不仅仅是B的大小。例如,在可能的情况下,现代编译器将使用memcpy来加快向量拷贝的速度。这通常是通过部分专门化元素类型的POD属性来实现的。从转发声明中你无法判断B是否为POD。 |
|
|
5
3
正如fyzix所说,转发声明不起作用的原因是内联构造函数。即使是空构造函数也可能包含大量代码,比如非POD成员的构造。在您的例子中,您有一个要初始化的向量,如果不完全定义它的模板类型,就无法初始化它。 析构函数也是如此。向量需要模板类型定义来告诉销毁它所持有的实例时要调用什么析构函数。
http://www.chromium.org/developers/coding-style/cpp-dos-and-donts |
|
|
6
1
无论您是使用向量还是尝试实例化一个B,这都无关紧要。实例化需要对象的完整定义。 |
|
7
0
老兄,你在举例
|
|
|
8
-12
无法使用转发声明的原因是B的大小未知。
编辑: |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |