0

我希望能够做到以下几点:

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

我该如何克服呢?

4

2 回答 2

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<<操作员返回 a 的调用没有修改您的字符串。

于 2018-11-13T19:10:05.020 回答
1

这可能不是您要寻找的东西,而是您的代码

std::cout << str_manip("string to manipulate");

参数 tostr_manip不是 a stringbut const char*(实际上是一个数组,但可以转换为char指针)。您可以基于此重载。

std::string str_manip(const char* s)
{
    std::string str(s); // create str
    // manipulate str
    return str;
}

但是,让我们看大局。当您str_manip在代码中看到时,这是否意味着“更改字符串”或“根据给定字符串创建新字符串”?你想故意对真正的含义产生矛盾吗?

考虑自己在未来 1 年内阅读您的代码。当你看到一个调用时你会怎么想str_manip- 这会改变它的参数吗?上一个问题的答案是否取决于上下文?

编写代码的目标是使其清晰,尤其是在像 C++ 这样的多范式语言中。所以,在我看来,不要做你正在考虑的超载。取而代之的是,制作 2 个不同的名称,例如

void frobnicate_str(std::string&) {...}
std::string get_frobnicated_str(std::string) {...}
于 2018-11-13T19:13:10.063 回答