Проблема при использовании типа созданного typedef среди аргументов функции

Вот код:

//Crypto.h
typedef uint8_t IV[16];

class AES {
    private:
    IV iv;

    public:
    void setIV(IV iv);
}

//Crypto.cpp
void AES::setIV(IV iv) {
    this->iv = iv;
}

При компиляции появляется ошибка:

src\Crypto.cpp: In member function 'void AES::setIV(uint8_t*)':
src\Crypto.cpp:25:14: error: incompatible types in assignment of 'uint8_t* {aka unsigned char*}' to 'IV {aka unsigned char [16]}'
     this->iv = iv;

Как отключить преобразование типов в аргументах функции? Или есть другой вариант создания типа IV на основе массива uint_8[16] (он же byte[16]), не преобразующегося в uint8_t* в аргументе функции?

Upd 20200120 14:13.

Основное требования к вектору инициализации (IV) согласно стандарту AES (режим CBC) заключается в длине этого вектора, которая должна быть равна размеру блока (в AES - 128 бит). Поэтому в идеале нужно, что бы в функцию нельзя было передавать массив произвольной длины (для этого и создаю тип IV на основе массива размером 16 байт). Насчёт присваивания массива: да, я в курсе, что так делать не стоит (причина - хотел показать, что в аргументе преобразуется массив фиксированного размера в указатель, от чего я и хочу избавиться).

P.S. Вопрос закрою завтра, если не найдётся гений, что сможет придумать фантастическое решение проблемы.


Ответы (1 шт):

Автор решения: AlexGlebe

Структура имеет способность полного копирования, и в адрес автоматически не преобразовывается.

struct IV {
  uint8_t a[16];
} ;
// ..
IV a ;
// полное копирование
IV b = a;
// адрес структуры
IV * p = & a ;
// адрес массива
uint8_t * pa = a . a ;
→ Ссылка