Xerces-C++中createDocument函数调用不匹配问题求助
解决Xerces DOMImplementation::createDocument编译错误的方法
首先咱们拆解下这个编译错误的核心原因:
no known conversion for argument 2 from ‘const wchar_t [19]’ to ‘const XMLCh* {aka const char16_t*}’
Xerces内部用XMLCh作为标准字符类型,在你的编译环境里它被定义成了char16_t,但你传入的L"dummy_measurements"是wchar_t类型的宽字符串,两者类型不兼容,直接导致参数匹配失败。另外你用0(int类型)作为空指针参数,虽然不是主要报错点,但也存在隐式转换的问题,咱们一起修正。
下面是具体的解决方案:
方法1:直接用UTF-16字面量(C++11及以上推荐)
因为XMLCh本质就是char16_t,你可以直接用C++11引入的u""字面量来替代L"",类型完全匹配,代码也最简洁:
DOMDocument* p_dom_document = p_dom_implementation->createDocument( nullptr, // 不需要命名空间,用nullptr替代0更规范 u"dummy_measurements", // char16_t类型字面量,直接匹配XMLCh*参数 nullptr // 不需要DOMDocumentType,同样用nullptr );
方法2:转换宽字符串(适配已有wchar_t场景)
如果你的代码必须使用wchar_t类型的字符串,可以用Xerces提供的XMLString::fromWCS函数完成类型转换:
const wchar_t* root_name_w = L"dummy_measurements"; XMLCh* root_name_xml = XMLString::fromWCS(root_name_w); DOMDocument* p_dom_document = p_dom_implementation->createDocument( nullptr, root_name_xml, nullptr ); // 转换生成的XMLCh*需要手动释放,避免内存泄漏 XMLString::release(&root_name_xml);
方法3:转换普通ASCII字符串(最常用场景)
如果你的根元素名是ASCII字符,直接用XMLString::transcode把普通char*字符串转成XMLCh*,这也是Xerces官方文档里最常用的方式:
const char* root_name = "dummy_measurements"; XMLCh* root_name_xml = XMLString::transcode(root_name); DOMDocument* p_dom_document = p_dom_implementation->createDocument( nullptr, root_name_xml, nullptr ); // 记得释放转换后的内存 XMLString::release(&root_name_xml);
额外注意点
- 尽量用
nullptr替代0作为空指针参数,代码可读性更强,也能避免int到指针的隐式转换问题。 - 所有通过
XMLString::transcode或XMLString::fromWCS生成的XMLCh*指针,使用后必须调用XMLString::release释放,防止内存泄漏。
内容的提问来源于stack exchange,提问作者akrilmokus
相关产品推荐
相关产品推荐

