C++ C++;:无法在分配中将*转换为(*)[]

C++ C++;:无法在分配中将*转换为(*)[],c++,templates,C++,Templates,我正在处理一个表示托管阵列的模板类 E (*data)[]; 数据是我的数组 data = new E[size]; 这个,它不喜欢。它把我扔了 无法将分配中的组件*转换为组件(*)[] 有什么好处 还有谁能解释为什么E用*表示,即使我没有将指针类型传递到我的模板类型中?只需将您的数据成员设置为E*。您仍然可以索引数组样式的数据[i](当与指针和整数值一起使用时,该符号基本上意味着添加指针和i乘以指向对象的大小) 编辑: 模板 X类 { X(int initial_size):数据_(新的E

我正在处理一个表示托管阵列的模板类

E (*data)[];
数据是我的数组

data = new E[size];
这个,它不喜欢。它把我扔了

无法将分配中的组件*转换为组件(*)[] 有什么好处


还有谁能解释为什么E用*表示,即使我没有将指针类型传递到我的模板类型中?

只需将您的
数据
成员设置为
E*
。您仍然可以索引数组样式的数据[i](当与指针和整数值一起使用时,该符号基本上意味着添加指针和i乘以指向对象的大小)

编辑:

模板
X类
{
X(int initial_size):数据_(新的E[initial_size]),大小_(initial_size){}
X(常数X&rhs):数据(新的E[rhs.size]),大小(rhs.size){std::copy(…);}
~X(){delete[]data_;}
空隙容量(整型新尺寸)
{
E*p=新的E[新尺寸];
std::复制(p,p+新尺寸,数据);
删除[]数据;
数据=p;
大小=大小;
}
...
私人:
E*数据;
int-size_389;;
};
数据
是指向E数组的指针,而不是指向E的指针(不要与指向E的指针数组混淆)。这是一个非常明显的区别

编辑:帮助你理解

new
向您返回一个指向
E
的指针,但您已将
数据
声明为指向E的数组的指针。数组是C中的一种类型!它不仅仅是一个伪装的指针。在某些情况下,数组可能会衰变为指针,但它不是双向的

编辑2:

根据您的评论:


我的印象是我正在创建一个新的E指针数组

首先,输入:

int (*data)[];
读一下上面写的。现在输入:

int *data[];
再读一遍,注意它说的不是同一件事。一个是指向int数组的指针,另一个是指向int的指针数组。差别很大

如果要动态分配指针数组,则应将
数据
声明为:

E **data;
然后

data = new E*[size];

你能补充一下你的答案吗?我不知道你的意思。抛出我:ComponentA*到ComponentA*[0]的赋值中的不兼容类型@Sidar:我无法想象你是如何做到的;-)。我已经充实了几个说明性的函数……@Sidar:要知道这只是一个例子。如果您在代码中使用这个类,请注意是的,我想我也遇到了这个问题。但创建该阵列似乎是最大的问题=[@Sidar:那为什么会混淆呢?指向E数组的指针与指向E的指针完全不同。C中的数组是它自己的类型,它不仅仅是一个屏蔽指针(尽管在某些情况下它会衰减为指针)我的印象是我在创建一个新的E指针数组?@Sidar:不;你在创建一个指向E数组的指针,而不是指向E的指针数组。这有很大的区别。我将添加一个example@Sidar当前位置我添加了另一个示例,这应该可以让您运行。我也会接受您的答案。但系统不是这样运行的rks.我仍然想谢谢你。所以谢谢=D在你的编辑之后,我已经在我的回答中解决了这个问题。你的第一个问题是误导性的;你需要调用
新的E*[size];
你还需要将
数据
设置为
E**
,因为你不能分配给数组。@EdS。我的编辑是在Tony给我一些指针之后进行的(没有双关语的意思)。我原来的问题仍然有效。这就是我再次删除它的原因。但现在一切都正常了。
E **data;
data = new E*[size];