C++函数调用失败:参数类型不匹配报错求助
解决printstats函数的编译错误问题
嘿,你遇到的这个编译错误其实很明确——就是函数调用时的参数类型不匹配,咱们一步步拆解:
错误根源
你在main里调用printstats(&x, y)的时候,传了&x,这是一个const std::string*(指向const字符串对象的指针),但你定义的两个printstats重载函数都不接受这个类型:
- 第一个重载
void printstats(const std::string& x, int statnum)需要的是const std::string的引用,不是指针; - 第二个重载
void printstats(char * x, int stat_num)需要的是非const的char*指针,和const std::string*完全不兼容。
另外还有个小问题:你只声明了第一个const std::string&版本的重载,但没写实现代码,就算参数传对了也会触发链接错误。
推荐的解决方案(方法一)
直接使用C++风格的字符串引用,去掉调用时的&符号,同时补充第一个重载的实现:
// C++ program to illustrate call by reference #include <stdio.h> #include <iostream> #include <ctime> // For time() #include <cstdlib> // For srand() and rand() #include <string> #include <cstring> // 补全第一个重载的实现 void printstats(const std::string& x, int statnum) { std::cout << x << ": " << statnum << std::endl; } void printstats(char * x, int stat_num) { printf("%s: %d", x, stat_num); } int main(void) { const std::string x = "Strength"; // 这里不需要用引用,直接定义const字符串对象即可 int y = 7; // 直接传递x,编译器会自动匹配到const std::string&的重载 printstats(x, y); return 0; }
这个方案完全贴合C++的编程习惯,避免了指针操作的风险,代码可读性也更高,运行后就能输出你想要的Strength: 7。
备选方案(方法二,不推荐)
如果你非要用第二个char*参数的重载,需要把std::string转换成C风格字符串,但因为你的字符串是const的,得用const_cast去掉const属性(注意:如果后续修改这个指针指向的内容会导致未定义行为,所以谨慎使用):
int main(void) { const std::string x = "Strength"; int y = 7; // 转换为const char*后去掉const属性 printstats(const_cast<char*>(x.c_str()), y); return 0; }
内容的提问来源于stack exchange,提问作者Max Bethke
相关产品推荐
相关产品推荐

