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

C++ : cannot convert * to (*)[] in assignment

本文关键字:转换 赋值 C++      更新时间:2023-10-16

我正在处理表示托管数组的模板类。

E (*data)[];

数据是我的数组。

data = new E[size];

而这个,它不喜欢。 它把我扔了;

无法在赋值中将组件*转换为组件(*)[] 什么给?

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

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];

只需将您的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_;
};