我今天在调试 SWIG 类型映射时遇到了一个有趣的问题。任何人都想告诉我为什么 Visual C++ 2008 在从 ourLib::Char *
转换为 const ourLib::Char * &
时抛出“转换丢失限定符”错误?我认为 Type *
-> const Type *
是一个微不足道的转换,并且(在调用函数时)Lvalue
-> Lvalue &
还有。
编辑:我们最终采用的解决方案:
// ourLib::Char is a typedef'ed char on Win32
%typemap(in) const char* (const ourLib::Char* tmp)
{
if (!bapiLua::LuaTraits<ourLib::Char*>::FromLuaObject(L, $argnum, tmp)) SWIG_fail;
$1 = const_cast<char *>(tmp);
}
// And in a different source file, already written:
namespace bapiLua {
template<>
struct LuaTraits<ourLib::Char*>
{
static ourLib::Bool FromLuaObject(lua_State* L, int pos, const ourLib::Char*& o_result);
};
}
从 const ourLib::Char * tmp
中删除 const
会导致我描述的错误。
最佳答案
假设您有以下功能:
void test( const char*& pRef)
{
static const char somedata[] = { 'a' ,'b', 'c', '\0'};
pRef = somedata;
}
如果你传入一个非常量 char*
,那么当 test()
返回时编译器会丢失 p
指向的是 const
。
这与此 C++ FAQ Lite 问题中给出的原因基本相同(处理指向指针的指针而不是指针引用):
关于C++ "conversion loses qualifiers"编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49704012/