#cpp #qt5
Пытаюсь с QByteArray получить указатель на данные с помощью data(),
ругается:
ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive]
char * TempPtrBuff = ARes.data();
В документации пишется, что возвращается char *.
Почему может возникать ошибка?
Ответы
Ответ 1
Результат вывода QByteArray::data() зависит от константности метода, в котором производится вызов обозначенной функции. Проще говоря: void MyClass::method() { char *data = ARes.data(); } void MyClass::method() const { const char *data = ARes.data(); } Соответственно, если вывод QByteArray::data() отличен от желаемого, то измените константность метода или осуществите приведение типа, например, тем же const_cast(). Ответ 2
QByteArray::data() имеет перегрузки по наличию константности у объекта QByteArray, для которого данная функция вызывается. Если контекст использования результата вызова data() подразумевает возможность изменения данных через полученный указатель, то нужно использовать именно неконстантный объект QByteArray и использовать тип char* для переменной. Если при этом возникает ошибка как в Вашем вопросе, значит Вы собираетесь изменить данные константного объекта. Это говорит об ошибке в проектировании объемлющего класса (исхожу из предположения, что QByteArray в Вашем случае является членом класса). Если результат data() не предполагается изменять, то на константность объекта QByteArray можно не обращать внимания, а просто использовать const char* для переменной. Попытка убрать константность через const_cast может кончится плачевно (UB), если используемый объект действительно константен. Пример, актуальный для любого типа T: T obj; const T& cref = T; T& ref = const_cast(cref); // OK, т.к. cref реально ссылается на неконстантный объект const T obj; const T& cref = T; T& ref = const_cast (cref); // Плохо, т.к. cref реально ссылается на константный объект Попытка модифицировать obj через ссылку ref во втором случае приводит к неопределенному поведению. Другой способ избежать ошибки в строке инициализации TempPtrBuff - использовать auto: auto TempPtrBuff = ARes.data(); Но это всё равно не даст возможности модифицировать константный объект.
Комментариев нет:
Отправить комментарий