我写了一个文件IO库。一个函数File::read
看起来像这样:
template <typename T>
void File::read(T * t, unsigned long count) const
它将count
T读入*t
。
现在,跳到客户端。我分配了一个我想读入的内存缓冲区。我写了这篇文章并且效果很好:
float * buffer = new float [16];
file->read(buffer, 16);
然而,这并非例外安全。所以我决定将缓冲区包装在std::unique_ptr
中。在这里的某个地方,我犯了一个错误。
std::unique_ptr<float[]> buffer (new float[16]);
file->read(*buffer , 16);
这会在file-&gt; read:
上产生以下错误'operator *'不匹配(操作数类型为'std :: unique_ptr')
我认为通过解除引用unique_ptr
,我会得到一个指向float[]
数组的第一个元素的指针。我的错误在哪里,修复是什么?
答案 0 :(得分:5)
你有几个问题:首先是你std::unique_ptr
float[]
(即你有一个指向float
数组的指针。)
另一个问题是智能指针就像普通指针一样。当您使用*
运算符取消引用普通指针时,您不再有指针而是一个值(指针指向的值)。
另外,我建议您使用std::array
(如果您知道编译时的大小)或std::vector
而不是智能指针。在现代C ++中,几乎不需要指针。
您可以像
一样使用它std::array<float, 16> buffer;
file->read(buffer.data(), buffer.size());
如果您没有std::array
,则可以使用std::vector
代替:
std::vector<float> buffer(16); // Create a vector of 16 floats,
// default initialized (i.e. 0.0)
// &buffer[0] is a pointer to the first element in the vector
// all vectors are guaranteed to be contiguous like normal arrays
file->read(&buffer[0], buffer.size());