Ошибка при foreach

453
01 января 2020, 07:40

Почему ругается? Хочу пройтись по этим символам циклом.

 void binarystream::write(char bytes[]) {
        for (char byte : bytes)
        {
        }
    }

Вот такая ошибка:

не найдена соответствующая функция "begin", необходимая для этого основанного на диапазоне оператора for
Answer 1

Данное объявление функции

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)
    {
    }
Answer 2

При такой передаче - 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]) 
Answer 3

Тип параметра функции char bytes[] неявно изменяется на char *, то бишь голый указатель. Соответственно использовать цикл for each с одним указателем нельзя. Передавайте массив по ссылке или используйте array_view

READ ALSO
C++ порядок инициализации членов-класса

C++ порядок инициализации членов-класса

В каком порядке пройдет инициализация членов класса в С++? Сначала будет вызван конструктор класса или сначала будут проиницилазованы члены-класса?

165
Конвертировать long в char array

Конвертировать long в char array

Мне нужно сконвертировать переменную типа long в char arrayКак это организовать?

164
Оптимизация многопоточности

Оптимизация многопоточности

У меня есть приложение (java, android), которое запускает N фоновых потоков Число потоков задаётся пользователемЗапуск потоков происходит в цикле...

213