快板/c++;无法将参数3从';常量字符*';至';字符*'; 我是一个试图学习C++和Alelgo的NoOB,我正在跟随一个教程,我是如何想出这个代码的。我的问题是:
textout_center_ex(屏幕,font1,Draw.c_str(),scrW/2,scrH/2,eBlue,-1) 当涉及到'Draw.c_str()'时,我得到一个错误:类型为“const char*”的参数与类型为“char*”的参数不兼容 如果我尝试构建,我会得到“错误C2664:'void textout_center_ex(位图*,字体*,字符*,int,int,int,int)”:无法将参数3从“const char*”转换为“char*” 我如何解决这个问题快板/c++;无法将参数3从';常量字符*';至';字符*'; 我是一个试图学习C++和Alelgo的NoOB,我正在跟随一个教程,我是如何想出这个代码的。我的问题是:,c++,c,string,char,allegro,C++,C,String,Char,Allegro,textout_center_ex(屏幕,font1,Draw.c_str(),scrW/2,scrH/2,eBlue,-1) 当涉及到'Draw.c_str()'时,我得到一个错误:类型为“const char*”的参数与类型为“char*”的参数不兼容 如果我尝试构建,我会得到“错误C2664:'void textout_center_ex(位图*,字体*,字符*,int,int,int,int)”:无法将参数3从“const char*”转换为“char*” 我如何解决这个问题 // Se
// 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;
(抬头:我的C++经验有点生疏,我可能不记得一些C++细节)
您正在证明一个函数具有不同于它所要求的数据类型。它要求一些可变的东西,而你给它一些不变的东西 我认为在实际操作中,函数仍然会收到char指针的副本(因此,如果它在内部更改指针的值,则无关紧要),但是编译器可能会抱怨 要解决此问题,可以将整个文本(char*指向一个char数组,以\0结尾,对吗?)复制到一个新的char数组,并将其提供给函数。也许有一个更新的API,它改变了签名,把参数的“const”合并到了一起。(抬头:我的C++经验有点生疏,我可能不记得一些C++细节) 您正在证明一个函数具有不同于它所要求的数据类型。它要求一些可变的东西,而你给它一些不变的东西 我认为在实际操作中,函数仍然会收到char指针的副本(因此,如果它在内部更改指针的值,则无关紧要),但是编译器可能会抱怨要解决此问题,可以将整个文本(char*指向一个char数组,以\0结尾,对吗?)复制到一个新的char数组,并将其提供给函数。可能有一个较新版本的API更改了签名以包含参数的“const”。如果函数保证不改变指向的数据,则可以使用
const\u cast
将参数强制转换为char*
:
textout_centre_ex(screen, font1, const_cast<char*>(Draw.c_str()), scrW / 2, scrH / 2, eBlue, -1);
^~~~~~~~~~~~~~~~~~ ~
textout_center_ex(屏幕、字体1、常量(Draw.c_str())、scrW/2、scrH/2、eBlue,-1);
^~~~~~~~~~~~~~~~~~ ~
更好的解决方案是使用GCC/Clang或
#在包含任何Allegro头之前自己定义AL_CONST
进行编译,这样就可以在它应该位于的位置获得CONST
,并且不必在代码中乱丢丑陋的强制转换。如果函数保证不改变指向的数据,则可以使用const\u cast
将参数强制转换为char*
:
textout_centre_ex(screen, font1, const_cast<char*>(Draw.c_str()), scrW / 2, scrH / 2, eBlue, -1);
^~~~~~~~~~~~~~~~~~ ~
textout_center_ex(屏幕、字体1、常量(Draw.c_str())、scrW/2、scrH/2、eBlue,-1);
^~~~~~~~~~~~~~~~~~ ~
更好的解决方案是使用GCC/Clang或
#在包含任何Allegro头之前自己定义AL_CONST CONST
,这样你就可以在它应该在的地方获得CONST
,而不必在代码中乱丢难看的类型转换。你在使用什么Allegro实现?根据,第三个参数是const char*
,而不是char*
。这是有意义的,因为函数不应该修改字符串。我正在使用allegro 4.4.2,我猜你的库出了问题。@Jack allegro 4.4仅在使用GCC编译时才将AL_CONST
定义为CONST
。(,)@tuple_cat:aconst_cast
是一个不错的选择,但是AL_-const的基本原理似乎已经过时了,因为它指的是不支持const
的编译器,现在应该不多了。我们不知道OP编译器,但我想用AL_CONST CONST
编译Allegro是安全的,您使用的Allegro实现是什么?根据,第三个参数是const char*
,而不是char*
。这是有意义的,因为函数不应该修改字符串。我正在使用allegro 4.4.2,我猜你的库出了问题。@Jack allegro 4.4仅在使用GCC编译时才将AL_CONST
定义为CONST
。(,)@tuple_cat:aconst_cast
是一个不错的选择,但是AL_-const的基本原理似乎已经过时了,因为它指的是不支持const
的编译器,现在应该不多了。我们不知道OP编译器,但我想用AL_CONST CONST
编译Allegro是安全的char*
和CONST char*
之间的区别不是指针是否不可变,而是指针指向什么。是的,函数接收指针的副本,但是通过常量指针它不能改变指向的对象,而通过非常量指针它可以。因此编译器必须抱怨。char*
和const char*
之间的区别不是指针是否不可变,而是指针指向什么。是的,函数接收指针的副本,但是通过常量指针它不能改变指向的对象,而通过非常量指针它可以。所以编译器一定会抱怨。@billybrian:你真的应该仔细看看Jack在最初的帖子中给你的线索。根据文档,函数应该采用常量char*
,这很有意义,因为它在打印数据时不应该修改数据。我会找出你为什么不使用,并找出真正的问题,不使用难看的绷带。@user1320881 Allegro 4.4不使用const
,除非库是用GCC编译的。见我在原帖上面的评论。我从哪里开始。。。。我应该重新安装allegro吗