我试图用真正的call-by-reference交换const char上的两个点。但我有问题。
void swap(const char *&str1, const char *&str2) { //swap char pointers
const char *one = str1;
str1 = str2;
str2 = one;
}
int main(void){
const char *str1 = "Apple";
const char *str2 = "Potato";
swap(*str1, *str2);
return 0.0;
}
我继续收到此错误:
从'char'无效转换为'const char'
答案 0 :(得分:3)
调用swap
时,不应该取消引用指针。你需要打电话:
swap(str1, str2);
或者,更好的是,使用std::swap。
此外,如果您尝试运行您编写的代码,则需要原型swap
或交换函数:
void swap(const char *&str1, const char *&str2)
{
const char *one = str1;
str1 = str2;
str2 = one;
}
int main(void)
{
const char *str1 = "Apple";
const char *str2 = "Potato";
swap(str1, str2);
return 0;
}
此外,main
返回一个int,而不是float
答案 1 :(得分:3)
您应该使用std::swap
(位于<algorithm>
或<utility>
标题中),而不是自己滚动:
std::swap(str1, str2);
此外,您应该考虑使用std::string
代替const char*
:
std::string str1 = "Apple";
std::string str2 = "Potato";
当然std::swap
算法仍然可以正常工作。
最后,在C ++中,void
和main
的参数列表中的return 0.0
都不是必需的。
以下是使用上述建议重新审视的代码:
#include <algorithm>
#include <string>
#include <iostream>
int main() {
std::string str1 = "Apple";
std::string str2 = "Potato";
std::swap(str1, str2);
}
和here是实例。
在回答Cthulhu先生的问题时,我会尝试更明确地回答这个问题。
您的错误是由于通过解除引用const char*
类型的指针,您实际上得到了const char&
类型的表达式,这显然与您swap
中表达的类型不兼容功能。这是对函数的正确调用:
swap(str1, str2);
但又一次,为什么要复制std::swap
的代码? (这是一个修辞问题,如果你想知道这是“不是答案”)
答案 2 :(得分:0)
您在调用之后定义swap()
。在C ++中,应该在调用函数之前定义函数。将swap()
的定义移至文件顶部main()
上方。然后您将收到此错误:
test.cpp:11: warning: converting to ‘int’ from ‘double’
您的main()
函数应该返回0
(int
),而不是0.0
double
。
解决这个问题,你最终会收到这个错误:
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of reference of type ‘const char*&’ from expression of type ‘const char’
test.cpp:1: error: in passing argument 1 of ‘void swap(const char*&, const char*&)’
这是因为您将您的参数解除引用swap()
。删除*
,程序现在可以正常工作。
但,您只需完全删除swap()
功能#include <utility>
,然后使用std::swap()
。