2014-03-30 140 views
0

再次以“在C++中使用C”的方式提出问题。在我用C++实现APR的实验中,我遇到了一个新问题。 C++的头文件:错误:无效从'void *'转换为'test :: apr_size_t * {aka long unsigned int *}'[-fpermissive]

#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

+0

代替“将C编译为C++”,将C编译为C,然后将C++编译为C++,并让链接器执行连接 –

回答

1

apr_pcalloc返回一个void *,你可能需要到static_cast到你想要的类型(apt_size_t *在这种情况下)。

0

在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我是无法理解。

相关问题