0

再次回到“在 C++ 中使用 C”之类的问题。在我在 C++ 中使用 APR 的实验中,我面临一个新问题。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

4

2 回答 2

1

apr_pcalloc 返回一个 void*,您可能需要将其静态转换为所需的类型(在本例中为 apt_size_t*)。

于 2014-03-30T12:46:31.753 回答
0

在 C++ 中,任何指针都可以隐式转换为void*(就像在 C 中一样)。但与 C 不同的是,在 C++ 中,void*类型的指针不能隐式转换为int*, or void**, or std::string*, 或其他。

解决方案是reinterpret_cast

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

虽然为什么有人要long在堆上分配一个孤独的东西是我无法理解的。

于 2014-03-30T12:48:12.797 回答