C ++ «преобразование теряет квалификаторы» ошибка компиляции - PullRequest
1 голос
/ 11 августа 2009

Сегодня я столкнулся с интересной проблемой при отладке типографских карт 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 вызывает описанную мной ошибку.

1 Ответ

9 голосов
/ 11 августа 2009

Скажем, у вас была следующая функция:

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

Если вы передали неконстантный char*, то при возврате test() компилятор потерял бы тот факт, что p указывает на const.

По сути, это та же причина, что и в этом вопросе C ++ FAQ Lite (касающемся указателей на указатели, а не ссылок на указатели):

...