C++ "conversion loses qualifiers"编译错误

标签 c++ swig

我今天在调试 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/

相关文章:

c++ - 为什么禁止使用析构函数的地址?

python - SWIG 3 使用模板化构造函数包装未模板化的类

c++ - 带有指向数据成员的指针的 std::thread

c++ - "while"和 "delete"的这种奇怪组合意味着什么?

java - JVM:如何管理 JNI 创建的堆外内存

c - C 结构声明中的 SWIG 语法错误

c# - 为 C# 使用 swig 时出现 TypeInitializationException

c++ - SWIG:std/multimap.i 似乎因 Tcl 包装而损坏

C++ std::enable_if

c++ - 为什么 Qt 既不能识别我的头文件,也不能识别我的库文件?