'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

上一篇: 'operator =' is ambiguous for std::string

下一篇: Incredible Google Chrome Render