2009-08-10 86 views
0

今天我在调试SWIG类型映射时遇到了一个有趣的问题。任何人都在关注为什么Visual C++ 2008在从ourLib::Char *转换为const ourLib::Char * &时出现“转换失去限定符”错误的原因?我认为Type * - >const Type *是一个简单的转换,并且(当调用函数时)Lvalue - >Lvalue &也是如此。C++“转换失去限定符”编译错误

编辑:我们最终的解决方案与打算:

// 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 * tmpconst使我描述的错误。

+0

好像不应该是来自你所描述的错误。你能发布一些代码来重现错误吗?另外,除了const之外,还有其他限定符吗(例如volatile)? – 2009-08-10 21:11:10

+0

这是一个小写的'char'吗?也许你应该发布一些代码。 – GManNickG 2009-08-10 21:11:27

回答

9

假设您有以下功能:

void test( const char*& pRef) 
{ 
    static const char somedata[] = { 'a' ,'b', 'c', '\0'}; 
    pRef = somedata; 
} 

如果你在一个非const char*过去了,那么当test()返回编译器会失去什么p所指向的事实const

它本质上是在这个C++ FAQ精简版的问题给予相同的原因(与指针到指针而非指针引用买卖):

+0

这将解释它。 Argumentum ad Parashift一直是一种令人信服的策略。 – ChrisV 2009-08-10 21:38:27