gpt4 book ai didi

c++ - 'operator =' 对于 std::string 是不明确的

转载 作者:可可西里 更新时间:2023-11-01 18:37:34 26 4
gpt4 key购买 nike

我正在尝试使用我自己的转换运算符编写一个类,但我遇到了多个 operator= 的问题

我设法用下面的小代码重现了这个问题

#include <string>

class X
{
public:
operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};

void func( )
{
X x;
std::string s = "";
s = x;
}

我明白 std::basic_string有多个赋值运算符,这就是编译器感到困惑的原因。

如果我删除其中一个转换运算符,它会起作用,但我想知道是否有办法保留这两个运算符。

我的类将根据类型转换返回不同的值。

我也可以使用 static_cast<std::string>(x)强制类型转换,但我想知道是否有一种方法可以在没有静态类型转换的情况下做到这一点?

最佳答案

作为 KerrekSB suggested , 你可以使用

s = std::string(x);

或者,您可以执行强制转换:

s = (std::string) x;
// or
s = static_cast<std::string>(x);

第三种选择(由于可读性问题,我希望不要经常在野外看到这种选择)是直接访问运算符:

s = x.operator std::string();

如果您愿意权衡稍微不同的 API(并修复任何潜在的损坏),您可以按照 Roberto suggested 的方式进行操作并强制显式转换 just const char * 类型运算符:

class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};

这告诉编译器只允许隐式转换为std::string,并且要求您在以下情况下显式转换为const char *你想调用那个特定的运算符。


最后要注意的一件事:如果您正在设计将使用该特定类的其他类或方法,则要尝试的另一件事是通过为 class X 提供重载来反转它们的使用方式> 而不是将 X 转换为其他内容。

考虑 API 工作的替代方法总是好的。

关于c++ - 'operator =' 对于 std::string 是不明确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com