allegro/С++ не может преобразовать аргумент 3 из 'const char *' в 'char *'

Я нуб, пытающийся изучить С++ и аллегро, и следил за учебником, и именно так я придумал этот код. Моя проблема находится в строке:

"textout_centre_ex(экран, font1, Draw.c_str(), scrW/2, scrH/2, eBlue, -1);"

Когда дело доходит до «Draw.c_str()», я получаю сообщение об ошибке: аргумент типа «const char*» несовместим с параметром типа «char*».

Если я попытаюсь построить, я получаю «ошибка C2664: 'void textout_centre_ex (BITMAP *, FONT *, char *, int, int, int, int)': невозможно преобразовать аргумент 3 из 'const char *' в 'char *'"

Как я могу решить эту проблему?

// Set variables
int counter = 0;
std::string Word = "SuperAwesomeTrivia";
std::string Draw = "";

FONT *font1 = load_font("font1.pcx", NULL, NULL);

while (!closeWindow){

// Update
    Draw += Word[counter];
    counter++;

    if (counter > Word.length() - 1)
    {
        closeWindow = true;
    }

    // Draw
    textout_centre_ex(screen, font1, Draw.c_str(), scrW / 2, scrH / 2, eBlue, -1);
    if (!closeWindow)
        rest(200);
    else
        rest(2000);
    clear_bitmap(screen);
}
destroy_font(font1);
allegro_exit();

return 0;

person billybrian    schedule 30.12.2016    source источник
comment
Какую реализацию Allegro вы используете? Согласно документации, третьим аргументом является const char*, а не char*. И это имеет смысл, поскольку функция не должна изменять строку.   -  person Jack    schedule 30.12.2016
comment
Я использую аллегро 4.4.2   -  person billybrian    schedule 30.12.2016
comment
Я предполагаю, что что-то не так с вашей библиотекой тогда.   -  person Jack    schedule 30.12.2016
comment
@Jack Allegro 4.4 определяет AL_CONST как const только при компиляции с помощью GCC. (определение, не относящееся к GCC, GCC-определение)   -  person emlai    schedule 30.12.2016
comment
@tuple_cat: тогда const_cast - это то, что нужно, но обоснование AL_CONST кажется довольно устаревшим, поскольку оно относится к компилятору, который не поддерживает const, в настоящее время их не должно быть много. Мы не знаем компилятор OP, но я думаю, было бы безопасно скомпилировать Allegro с помощью AL_CONST const   -  person Jack    schedule 30.12.2016


Ответы (2)


Вы можете использовать const_cast для приведения аргумента к char*, если функция гарантированно не изменит указанные данные:

textout_centre_ex(screen, font1, const_cast<char*>(Draw.c_str()), scrW / 2, scrH / 2, eBlue, -1);
                                 ^~~~~~~~~~~~~~~~~~            ~

Лучшим решением было бы скомпилировать с помощью GCC/Clang или #define AL_CONST const самостоятельно перед включением каких-либо заголовков Allegro, чтобы получить const в тех местах, где он должен быть, и не нужно засорять свой код уродливыми бросает.

person emlai    schedule 30.12.2016
comment
@billybrian: Вам действительно следует повнимательнее взглянуть на то, что Джек дал вам в первом посте. Согласно документации, функция должна принимать const char*, что имеет смысл, поскольку она не должна изменять данные при их печати. Я бы выяснил, почему у тебя нет, и нашел бы настоящую проблему, а не накладывал уродливую гипсовую повязку. - person Unimportant; 30.12.2016
comment
@ user1320881 Allegro 4.4 не использует const, если библиотека не скомпилирована с помощью GCC. Смотрите мой комментарий выше к оригинальному сообщению. - person emlai; 30.12.2016
comment
С чего бы мне начать.... я должен переустановить allegro? Извините, ребята, но я действительно новичок в этом. Я ценю помощь. - person billybrian; 30.12.2016
comment
@billybrian: рассказать, какой компилятор вы используете, было бы хорошим началом, поскольку проблема кажется вам диагностированной, если вы не используете GCC. - person Jongware; 30.12.2016
comment
Я бы посоветовал использовать последнюю версию Allegro 5, если вы начинаете новый проект. Allegro 4 даже не поддерживает, например. макОС. Если вы компилируете устаревший проект Allegro 4, вы можете получить предварительно скомпилированную версию Allegro 4 в диспетчере пакетов вашей системы или на веб-сайте Allegro. - person emlai; 30.12.2016
comment
Я использую MS Visual Studio 2013, и, насколько я могу найти, у него есть собственный компилятор... - person billybrian; 30.12.2016
comment
@billybrian На самом деле самым простым решением было бы определить AL_CONST как const самостоятельно, прежде чем включать какие-либо заголовки Allegro (желательно глобально в вашей системе сборки, например, с флагом /DAL_CONST=const в MSVC). Я думаю, это должно сработать. - person emlai; 30.12.2016
comment
@billybrian: рад, что помог, и добро пожаловать в Stack Overflow! Вы можете прочитать Что мне делать, когда кто-то ответит на мой вопрос?. - person Jongware; 30.12.2016

(внимание: мой опыт работы с С++ немного заржавел, я могу неточно вспомнить некоторые детали С++)

Вы доказываете, что функция использует другой тип данных, чем она запрашивает. Он просит что-то изменчивое, а вы даете ему что-то неизменное.

Я думаю, что с практической точки зрения функция по-прежнему получает копию указателя char (таким образом, не имеет значения, если она изменила значение указателя внутри), но компилятор, вероятно, в любом случае прав, чтобы пожаловаться.

Чтобы решить такую ​​проблему, вы можете скопировать весь текст (char* указывает на массив символов, оканчивающийся символом \0, верно?) в новый массив символов и предоставить его функции. Возможно, есть более новая версия API, в которой изменена подпись, чтобы включить «const» для параметра.

person Ray    schedule 30.12.2016
comment
Разница между char* и const char* заключается не в том, является ли указатель неизменным или нет, а в том, на что он указывает. Да, функция получает копию указателя, но с помощью константного указателя она не может изменить то, на что указывает, в то время как с помощью неконстантного указателя она может. Так что компилятор ДОЛЖЕН жаловаться. - person Unimportant; 30.12.2016