Ошибка: неправильное преобразование из 'void*' в 'test::apr_size_t* {aka long unsigned int*}' [-fpermissive]

Вернемся к вопросу "Использование C в C++". В моем эксперименте по использованию APR в C++ я столкнулся с новой проблемой. Заголовочный файл C++:

#ifndef TEST_STRINGCOMMONS_H_
#define TEST_STRINGCOMMONS_H_

namespace test {
class StringCommons {
public:
    static char* substr_offset_length(apr_pool_t *pool, const char* input,
                                  apr_size_t offset, apr_size_t length);
};
} /* namespace test */
#endif /* TEST_STRINGCOMMONS_H_ */

и реализация C++ этого:

namespace test {
...
char* substr_offset_length(apr_pool_t *pool, const char* input, apr_size_t offset, apr_size_t length)
{
    apr_size_t *input_length = apr_pcalloc(pool, sizeof(apr_size_t));
...
}

} // namespace test

Компилируя этот класс, я получаю ошибку:

error: invalid conversion from ‘void*’ to ‘test::apr_size_t* {aka long unsigned int*}’ [-fpermissive]

Я хотел бы знать, что не так с этим кодом. Кто-нибудь, помогите мне, пожалуйста.

С уважением, СК

2 ответа

apr_pcalloc возвращает void*, который может потребоваться для static_cast желаемого типа (в данном случае apt_size_t*).

В C++ любой указатель может быть неявно преобразован в void* (так же, как в C). Но в отличие от C, в C++ указатель void* тип не может быть неявно преобразован в int*, или же void**, или же std::string*или что угодно.

Решение reinterpret_cast:

apr_size_t *input_length = reinterpret_cast<apr_size_t *>(apr_pcalloc(pool, sizeof(apr_size_t)));

Хотя зачем кому-то выделять одинокого long в кучу за мной.

Другие вопросы по тегам