Прежде всего, имейте в виду, что если кто-либо использует методы size()
, empty()
или full()
экземпляра этого шаблона класса, в то время как кто-то другой одновременно использует get()
, put()
или reset()
, вы получите неопределенное поведение. size()
или empty()
также придется блокировать мьютекс, потому что они считывают значения объектов (full_
, head_
и tail_
), которые потенциально могут быть изменены одновременно. Кроме того, мне кажется, что put()
всегда что-то пишет, даже если очередь заполнена. Это, вероятно, не то, что обычно хочется.
Исходя из вашего описания, я предполагаю, что проблема, о которой вы спрашиваете, связана с попыткой создать, например, circular_buffer<float[4]>
. Подумайте, во что превратится метод get()
, если вы замените тип float[4]
на T
:
float get()[4] { … }
В результате вы получаете функцию, возвращающую массив. Функциям не разрешено возвращать массивы [dcl.fct] / 11 . * Вот почему вы заканчиваете с ошибкой компилятора, как только вы вызываете метод get()
для такого circular_buffer
. Используйте, например, std::array
вместо: circular_buffer<std::array<float, 4>>
.
*) Я считаю, что это наиболее вероятно по историческим причинам. Типы массивов, предназначенные для поведения при передаче функциям в C, были таковы, что массивы эффективно передавались по ссылке; у функции нет хорошего способа вернуть массив по ссылке, и возвращение по значению будет несовместимо с тем, как они передаются. Поэтому, вероятно, лучше всего вообще запретить возвращать массивы & hellip;