назначение unique_ptr с std :: move не работает - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в C ++ и интеллектуальных указателях, но насколько я понимаю, я могу назначить unique_ptr с помощью std :: move (еще один unique_ptr). когда я пытаюсь назначить unique_ptr с помощью std :: move (..), он выдает следующую ошибку:

binary '=': не найден оператор, который принимает правый операнд типа '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, он не работает.

1 Ответ

0 голосов
/ 07 мая 2020

Когда вы выполняете x = std::move(y) и y имеет тип std::unique_ptr<T>, тогда x также должен иметь тип std::unique_ptr<T> (или два типа, указатели которых неявно конвертируются), иначе присвоение не будет работать. Ваш код, как показано, может работать, только если T равен int8_t, потому что это то, что слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...