我对C ++和智能指针还是很陌生,但是据我了解,我可以为std :: move(另一个unique_ptr)分配一个unique_ptr。当我尝试使用std :: move(..)分配unique_ptr时,它将引发以下错误:
二进制'=':未找到采用'std :: unique_ptr
>']类型的右侧操作数的运算符 以下代码块是引发错误的位置,在最后第二行。
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); };
我尝试分配给具有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时不起作用。
我对C ++和智能指针还是相当陌生,但是据我了解,我可以为std :: move(另一个unique_ptr)分配一个unique_ptr。当我尝试使用std :: move(..)分配unique_ptr时,它会抛出...
[当您执行x = std::move(y)
且y
的类型为std::unique_ptr<T>
时,则x
的类型也必须为std::unique_ptr<T>
(或两种类型的指针可以隐式转换)),否则分配将不起作用。如图所示,您的代码仅在T
为int8_t
时才能工作,因为这就是左侧的内容。