'operator ='对于std :: string是不明确的
我正在尝试用自己的演员操作员编写一个类,但我遇到了多个operator=
s的问题
我设法用下面的小代码重现了这个问题
#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建议的那样,您可以使用
s = std::string(x);
或者,您可以执行演员:
s = (std::string) x;
// or
s = static_cast<std::string>(x);
第三种选择(我希望不会因为可读性问题而经常在野外看到)是直接访问操作员:
s = x.operator std::string();
如果你愿意做一个略微不同的API的折衷(并且修复任何潜在的破坏),你可以按照Roberto的建议去做,并强制只显示const char *
型运算符:
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
这告诉编译器只允许隐式转换为std::string
,并且当你想调用特定的操作符时,需要明确地转换为const char *
。
最后要注意的是:如果你设计的其他类或方法会消耗这个特定的类,那么另一个尝试是通过提供class X
的重载而不是将X
转换为其他class X
来反转它们的使用方式。
总是很好考虑你的API工作的替代方法。
如果你在char * cast上使用explicit
关键字,你将默认转换为std :: string。
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
在你的演员阵容之后:
X x;
std::string s = "";
s = x;
将成功(如果他想使用其他演员,你的班级的用户需要指定char * cast)
无论如何,作为班级的用户,我宁愿如果两个铸件都是明确的,所以我知道什么时候正在进行铸造
链接地址: http://www.djcxy.com/p/93569.html