Вернемся к вопросу «Использование 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]
Я хотел бы знать, что не так с этим кодом. Кто-нибудь, помогите мне, пожалуйста.
С наилучшими пожеланиями,
SK
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
в кучу за мной.