分配 unique_ptr 与 std::move 不工作
assigning an unique_ptr with std::move not working
我对 C++ 和智能指针很陌生,但据我所知,我可以将 unique_ptr 分配给 std::move(另一个 unique_ptr)。
当我尝试用 std::move(..) 分配 unique_ptr 时,它会抛出以下错误:
binary '=': no operator found which takes a right-hand operand of type 'std::unique_ptr<T [],std::default_delete<_Ty>>'
以下代码块是在倒数第二行引发错误的地方。
template<typename T>
void wave::WaveReader::readSamples(std::istream& input, int nr_of_bytes)
{
std::unique_ptr<T[]> a = std::make_unique<T[]>(this->data_chunk.subChunk2Size);
input.read(reinterpret_cast<char*>(this->data.data.get()), this->data_chunk.subChunk2Size);
this->data.length = (this->fmt.bitsPerSample / (nr_of_bytes * 8));
this->data.width = this->data_chunk.subChunk2Size / (this->fmt.bitsPerSample / 8);
this->data.data = std::move(a);
std::cout << sizeof(T) << std::endl;
}
一些额外的代码:
class WaveReader
{
private:
RIFFCHUNK riff;
FMTCHUNK fmt;
DATACHUNK data_chunk;
Array<int8_t> data;
std::variant<Array<int8_t>,Array<uint16_t>,Array<uint32_t>> samples;
public:
void read(std::string filepath);
private:
void readSamples(std::istream& input);
template<typename T>
void readSamples(std::istream& input,int nr_of_bytes);
std::string getDataChunkID(DATACHUNK& data);
void read_RIFFCHUNK(std::istream& input, RIFFCHUNK& riff);
void read_FMTCHUNK(std::istream& input, FMTCHUNK& fmt);
void read_DATACHUNK(std::istream& input, DATACHUNK& data, FMTCHUNK& fmt);
};
数组 class 和 unique_ptr 我正在尝试分配给
template <typename T>
struct Array
{
std::unique_ptr<T[]> data;
uint32_t length;
uint32_t width;
Array(int width, int length) : width(width), length(length)
{
data = std::make_unique<T[]>(width);
}
Array() : width(0), length(0)
{
data = std::make_unique<T[]>(0);
}
T operator[](const Position& pos) { return data[(pos.x * length) + pos.y]; }
};
附加代码:
此代码读取文件
void wave::WaveReader::read(std::string filename)
{
std::ifstream file(filename, std::ios::binary);
//read riff chunk
read_RIFFCHUNK(file, this->riff);
//read fmt chunk
read_FMTCHUNK(file, this->fmt);
//read data chunk, fills data object
read_DATACHUNK(file, this->data_chunk, fmt);
this->readSamples(file);
}
我使用此代码来确定样本存储的类型
void wave::WaveReader::readSamples(std::istream& input)
{
//get Type
switch (fmt.bitsPerSample)
{
case 8:
readSamples<uint8_t>(input,1);
break;
case 16:
readSamples<int16_t>(input, 2);
break;
case 24:
readSamples<int32_t>(input, 3);
break;
case 32:
readSamples<int32_t>(input, 4);
break;
default:
abort(); // need to change this probably
}
}
当我将数组结构中的 std::unique_ptr 更改为普通 int 时,它确实可以正常工作。当我将其更改为 T 时,它不起作用。
当你做 x = std::move(y)
并且 y
是 std::unique_ptr<T>
类型时,那么 x
也必须是 std::unique_ptr<T>
类型(或者两个类型的指针是隐式可转换的)或分配将不起作用。如图所示,您的代码仅在 T
为 int8_t
时才有效,因为它位于左侧。
我对 C++ 和智能指针很陌生,但据我所知,我可以将 unique_ptr 分配给 std::move(另一个 unique_ptr)。 当我尝试用 std::move(..) 分配 unique_ptr 时,它会抛出以下错误:
binary '=': no operator found which takes a right-hand operand of type 'std::unique_ptr<T [],std::default_delete<_Ty>>'
以下代码块是在倒数第二行引发错误的地方。
template<typename T>
void wave::WaveReader::readSamples(std::istream& input, int nr_of_bytes)
{
std::unique_ptr<T[]> a = std::make_unique<T[]>(this->data_chunk.subChunk2Size);
input.read(reinterpret_cast<char*>(this->data.data.get()), this->data_chunk.subChunk2Size);
this->data.length = (this->fmt.bitsPerSample / (nr_of_bytes * 8));
this->data.width = this->data_chunk.subChunk2Size / (this->fmt.bitsPerSample / 8);
this->data.data = std::move(a);
std::cout << sizeof(T) << std::endl;
}
一些额外的代码:
class WaveReader
{
private:
RIFFCHUNK riff;
FMTCHUNK fmt;
DATACHUNK data_chunk;
Array<int8_t> data;
std::variant<Array<int8_t>,Array<uint16_t>,Array<uint32_t>> samples;
public:
void read(std::string filepath);
private:
void readSamples(std::istream& input);
template<typename T>
void readSamples(std::istream& input,int nr_of_bytes);
std::string getDataChunkID(DATACHUNK& data);
void read_RIFFCHUNK(std::istream& input, RIFFCHUNK& riff);
void read_FMTCHUNK(std::istream& input, FMTCHUNK& fmt);
void read_DATACHUNK(std::istream& input, DATACHUNK& data, FMTCHUNK& fmt);
};
数组 class 和 unique_ptr 我正在尝试分配给
template <typename T>
struct Array
{
std::unique_ptr<T[]> data;
uint32_t length;
uint32_t width;
Array(int width, int length) : width(width), length(length)
{
data = std::make_unique<T[]>(width);
}
Array() : width(0), length(0)
{
data = std::make_unique<T[]>(0);
}
T operator[](const Position& pos) { return data[(pos.x * length) + pos.y]; }
};
附加代码: 此代码读取文件
void wave::WaveReader::read(std::string filename)
{
std::ifstream file(filename, std::ios::binary);
//read riff chunk
read_RIFFCHUNK(file, this->riff);
//read fmt chunk
read_FMTCHUNK(file, this->fmt);
//read data chunk, fills data object
read_DATACHUNK(file, this->data_chunk, fmt);
this->readSamples(file);
}
我使用此代码来确定样本存储的类型
void wave::WaveReader::readSamples(std::istream& input)
{
//get Type
switch (fmt.bitsPerSample)
{
case 8:
readSamples<uint8_t>(input,1);
break;
case 16:
readSamples<int16_t>(input, 2);
break;
case 24:
readSamples<int32_t>(input, 3);
break;
case 32:
readSamples<int32_t>(input, 4);
break;
default:
abort(); // need to change this probably
}
}
当我将数组结构中的 std::unique_ptr 更改为普通 int 时,它确实可以正常工作。当我将其更改为 T 时,它不起作用。
当你做 x = std::move(y)
并且 y
是 std::unique_ptr<T>
类型时,那么 x
也必须是 std::unique_ptr<T>
类型(或者两个类型的指针是隐式可转换的)或分配将不起作用。如图所示,您的代码仅在 T
为 int8_t
时才有效,因为它位于左侧。