我希望能够执行以下操作:
std::cout << str_manip("string to manipulate");
以及
std::string str;
str_manip(str);
std::cout << str;
为此,我有两个功能
#include <string>
// copying
std::string str_manip(std::string str)
{
// manipulate str
return str;
}
// in-place
void str_manip(std::string& str)
{
// manipulate str
}
但是它们会产生以下错误:
error: call of overloaded 'str_manip(std::__cxx11::string&)' is ambiguous
我该如何克服?
答案 0 :(得分:1)
问题在于此呼叫:
std::string str;
str_manip(str);
std::cout << str;
编译器不知道要调用哪个版本的str_manip
。
您可以将功能更改为以下形式:
#include <string>
// copying
std::string str_manip(const std::string& str)
{
std::string dup = str;
// manipulate dup
return dup;
}
// in-place
void str_manip(std::string& str)
{
// manipulate str
}
现在,编译器知道模糊调用必须是采用非{const
参数的函数。您还可以确保将std::string
返回给<<
运算符的调用没有修改您的字符串。
答案 1 :(得分:1)
这可能不是您想要的东西,而是您的代码
std::cout << str_manip("string to manipulate");
str_manip
的参数不是string
,而是const char*
(实际上是一个数组,但可以转换为char
指针)。您可以基于此进行超载。
std::string str_manip(const char* s)
{
std::string str(s); // create str
// manipulate str
return str;
}
但是,让我们看一看大局。当您在代码中看到str_manip
时,是否表示“更改字符串”或“根据给定的字符串创建新的字符串”?您是否想在真实含义上有矛盾之处?
考虑自己在未来一年内阅读代码。看到对str_manip
的调用时,您会怎么想-这会改变其参数吗?前一个问题的答案是否取决于上下文?
编写代码的目的是使代码更清晰,尤其是在像C ++这样的多范式语言中。因此,我认为,请不要做您正在考虑的重载。而是使用两个不同的名称,例如
void frobnicate_str(std::string&) {...}
std::string get_frobnicated_str(std::string) {...}