C ++:无法在赋值时将*转换为(*)[]

时间:2012-06-28 00:41:33

标签: c++ templates

我正在处理一个代表托管数组的模板类。

E (*data)[];

数据是我的数组。

data = new E[size];

而这,它不喜欢。它抛出了我;

  

无法在赋值时将Component *转换为Component(*)[]   是什么给了什么?

也可以解释为什么E用*表示,即使我没有将指针类型传递给我的模板类型?

2 个答案:

答案 0 :(得分:3)

E (*data)[];

data是指向E数组的指针,而不是指向E的指针(不要与指向E的指针数组混淆)。有一个非常明显的区别。

编辑:帮助您理解......

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

编辑2:

根据你的评论:

  

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

转到http://cdecl.org/

首先输入:

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_;
};