Почему ругается? Хочу пройтись по этим символам циклом.
void binarystream::write(char bytes[]) {
for (char byte : bytes)
{
}
}
Вот такая ошибка:
не найдена соответствующая функция "begin", необходимая для этого основанного на диапазоне оператора for
Данное объявление функции
void binarystream::write(char bytes[]);
эквивалентно следующему объявлению функции
void binarystream::write(char *bytes );
так как при объявлении параметра функции в виде массива переменная массива преобразуется в указатель на объект с типом, соответствующим типу своих элементов. А указатель не хранит информацию о том, указывает он на единственный объект, либо на первый элемент массива.
Поэтому в этом цикле
for (char byte : bytes)
{
}
компилятор ищет функцию begin
для указателя, которая не определена для указателей.
Поэтому лучше всего эту функцию объявить так, чтобы она принимала второй аргумент,задающий количество элементов в массиве, на первый элемент которого указывает первый параметр функции:
void binarystream::write(char bytes[], size_t n);
Тогда бы вы могли написать цикл в виде
for ( size_t i = 0; i < n; i++ )
{
// используете выражение bytes[i]
}
или в виде
for ( char *first = bytes; first != bytes + n; ++first )
{
// используете выражение *first
}
Другой подход - это объявить шаблонную функцию в виде
template <size_t N>
void binarystream::write(char ( &bytes )[N] );
Где массив передается по ссылке. В этом случае вы действительно можете использовать цикл
for (char byte : bytes)
{
}
При такой передаче - char bytes[]
- передается только указатель на первый элемент массива. Вызванная функция даже не подозревает о том, сколько там элементов и есть ли они вообще...
Вариант - передавайте количество элементов типа
void binarystream::write(char bytes[], size_t N)
{
for (size_t i = 0; i < N; ++i)
{
char byte = bytes[i];
или, если размер массива известен при компиляции - используйте (если будете передавать массивы разных размеров) шаблон наподобие
template<size_t N>
void binarystream::write(char (&bytes)[N])
или, если передается только массив одного конкретного размера, просто функцию
void binarystream::write(char (&bytes)[10])
Тип параметра функции char bytes[]
неявно изменяется на char *
, то бишь голый указатель. Соответственно использовать цикл for each с одним указателем нельзя. Передавайте массив по ссылке или используйте array_view
Виртуальный выделенный сервер (VDS) становится отличным выбором
В каком порядке пройдет инициализация членов класса в С++? Сначала будет вызван конструктор класса или сначала будут проиницилазованы члены-класса?
Мне нужно сконвертировать переменную типа long в char arrayКак это организовать?
У меня есть приложение (java, android), которое запускает N фоновых потоков Число потоков задаётся пользователемЗапуск потоков происходит в цикле...
Делаю приложение - мозайка из полигонов