我正在处理一个代表托管数组的模板类。
E (*data)[];
数据是我的数组。
data = new E[size];
而这,它不喜欢。它抛出了我;
无法在赋值时将Component *转换为Component(*)[] 是什么给了什么?
也可以解释为什么E用*表示,即使我没有将指针类型传递给我的模板类型?
答案 0 :(得分:3)
E (*data)[];
data
是指向E数组的指针,而不是指向E的指针(不要与指向E的指针数组混淆)。有一个非常明显的区别。
编辑:帮助您理解......
new
向您返回指向E
的指针,但您已将data
声明为指向E 数组的指针>。数组是C中的一个类型!它不仅仅是伪装的指针。在某些情况下,数组可能会衰减成指针,但它不会双向发生。
编辑2:
根据你的评论:
我的印象是我正在创建一个新的E指针数组?
首先输入:
int (*data)[];
阅读它的内容。现在输入:
int *data[];
再读一遍并注意它并没有说同样的事情。一个是指向int数组的指针,一个是指向int的指针数组。差异很大。
如果要动态分配指针数组,则data
应声明为:
E **data;
然后
data = new E*[size];
答案 1 :(得分:1)
只需将data
成员设为E*
即可。您仍然可以索引数组样式ala data[i]
(该符号,当与指针和整数值一起使用时,基本上意味着添加指针,i乘以指向对象的大小)。
编辑:
template <typename E>
class X
{
X(int initial_size) : data_(new E[initial_size]), size_(initial_size) { }
X(const X& rhs) : data_(new E[rhs.size_]), size_(rhs.size_) { std::copy(...); }
~X() { delete[] data_; }
void capacity(int new_size)
{
E* p = new E[new_size];
std::copy(p, p + new_size, data_);
delete[] data_;
data_ = p;
size_ = size;
}
...
private:
E* data_;
int size_;
};