В аргументе функции uint8_t buf[]
является просто синтаксическим сахаром для uint8_t *buf
.
Вы не можете передать необработанный указатель, где ожидается ссылка на фиксированный массив.Даже если бы вы могли, вы не можете передать значение времени выполнения, например siz
, в параметр шаблона, только константы, которые известны во время компиляции.Таким образом, DoItThisWay
просто не может вызвать DoIt
.
. Однако фиксированный массив превращается в указатель на свой первый элемент, поэтому DoIt
может вызывать DoItThisWay
, но только когда T
равен uint8_t
, что делает T
избыточным (если у вас нет нескольких перегрузок DoItThisWay
для разных типов данных или если DoItThisWay
это свой собственный T
параметр шаблона).
В любом случае, siz
аргумент DoIt
является избыточным и должен быть удален, так как DoIt
может использовать вместо него N
.
Попробуйте:
size_t DoItThisWay(uint8_t *buf, size_t siz)
{
// Work done here...
return 0;
}
template<size_t N>
size_t DoIt(uint8_t(&buf)[N])
{
return DoItThisWay(buf, N);
}
Или
size_t DoItThisWay(uint8_t *buf, size_t siz)
{
// Work done here...
return 0;
}
// other overloads of DoItThisWay...
template<typename T, size_t N>
size_t DoIt(T(&buf)[N])
{
return DoItThisWay(buf, N);
}
Или
template<typename T>
size_t DoItThisWay(T *buf, size_t siz)
{
// Work done here...
return 0;
}
template<typename T, size_t N>
size_t DoIt(T(&buf)[N])
{
return DoItThisWay(buf, N);
}