Ошибка компиляции C++ «преобразование теряет квалификаторы»
Вопрос
Сегодня я столкнулся с интересной проблемой при отладке карт типов 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
от const ourLib::Char * tmp
вызывает ошибку, которую я описал.
Решение
Допустим, у вас была следующая функция:
void test( const char*& pRef)
{
static const char somedata[] = { 'a' ,'b', 'c', '\0'};
pRef = somedata;
}
Если вы передали неконстантный char*
, потом, когда test()
вернулся, компилятор потерял бы тот факт, что p
указывает на это const
.
По сути, это та же причина, что и в этом вопросе C++ FAQ Lite (имеется дело с указателями на указатели, а не ссылками на указатели):