gpt4 book ai didi

c++ - 在赋值中转换指针类型

转载 作者:行者123 更新时间:2023-11-30 01:42:21 26 4
gpt4 key购买 nike

我有一个类有:

private:
uint32_t *data;

以及我正在执行的功能之一:

void foo() {
data = new uint32_t[size];
}

而且一切正常。现在我想让它更灵活一点,所以我想让 foo() 成为一个模板:

template<typename T>
T foo() {
data = new T[size];
}

我尝试使用它:

class.foo<uint64_t>();

但是编译失败说:

error: cannot convert 'long long unsigned int*' to 'unsigned int*' in assignment

有没有可能做这样的事情?我试着声明

void *data;

它编译了,但是我不能这样做

sizeof(data[1]);

这基本上就是我需要传递类型的原因。

编辑:

感谢您的回复,看了您的回复,有几点想补充。

  • 我使用原始指针而不是容器,因为它在外部硬件也使用的内存上运行(我没有在 PC 上运行它)。
  • 使用此内存对于此类来说是可选的,因此如果不需要,我不想分配它。
  • 我在几个根本不需要 *data 的地方使用了这个类,所以我宁愿避免让整个类成为一个模板。

另一个想法:默认模板类型可能是一个很好的折衷方案,有没有一种方法可以创建一个我以后不必那样使用的类:

Class<> my;

但仍然:

Class my;

如果需要的话:

Class<type> my;

?

最佳答案

与其将您的函数转换为模板,不如将您的类转换为模板:

template <class T>
class myclass {
private:
T *data;
public:
myclass(size_t size) : data(new T[size]) {
}
... // Add copy constructor, assignment operator, and a destructor
// to properly manage the pointer. See "rule of three" for more info.
};

这样数组元素的类型就成为类类型的一部分,让你的成员函数与 data 一起工作。无需任何额外的类型转换。

请注意,在类中使用原始数组指针会带来内存管理方面的重大责任。 std::vector<T> 你会过得更好.

关于c++ - 在赋值中转换指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com