'运营商=' std :: string是不明确的

时间:2016-10-07 21:39:18

标签: c++ c++11

我正在尝试使用自己的强制转换运算符编写一个类,但我遇到了多个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)强制演员,但我想知道是否有一种方法可以在没有静态演员的情况下进行演绎?

2 个答案:

答案 0 :(得分:2)

作为KerrekSB suggested,您可以使用

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

或者,您可以执行演员表:

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

第三种替代方案(由于可读性问题,我希望不会经常在野外看到)是直接访问运营商:

const char *

如果您愿意权衡稍微不同的API(并修复任何潜在的破坏),您可以执行Roberto suggested并强制显式 class X { public: explicit operator const char*() const { return "a"; } operator std::string() { return "c"; } }; 类型运算符:

std::string

这告诉编译器只允许隐式转换到const char *,并且当你想调用那个特定的运算符时,需要你明确地转换为class X

最后要注意的一点是:如果你正在设计其他会消耗这个特定类的类或方法,那么另一个要尝试的方法是通过为X提供重载来反转它们的使用方式。而不是将hash = {:foo =>{"string0"=>1, "string1"=>2}, :bar => {"string0"=>3, "string1"=>4}} Hash[*hash.max_by { |_k, v| v['string0'] }] #=> {:bar=>{"string0"=>3, "string1"=>4}} 转换为其他内容。

总是很好地考虑API的替代方法。

答案 1 :(得分:2)

如果在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)

任何方式,作为你班级的用户,如果两个演员都是明确的,我宁愿选择,所以我知道什么时候正在进行演员