我正在尝试用自己的转换运算符编写一个类,但是我遇到了多个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
suggested,您可以使用
s = std::string(x);
或者,您可以执行演员表:
s = (std::string) x; // or s = static_cast<std::string>(x);
第三种选择(由于可读性问题,我希望通常不会在野外看到)是直接访问运算符:
s = x.operator std::string();
如果您愿意权衡稍微不同的API(并修复任何可能的破坏),您可以执行Roberto suggested并强制显式转换const char *类型运算符:
class X { public: explicit operator const char*() const { return "a"; } operator std::string() { return "c"; } };
这告诉编译器只允许对std :: string进行隐式转换,并且当您要调用该特定运算符时,需要显式转换为const char *.
最后要注意的一点是:如果你正在设计其他会消耗这个特定类的类或方法,那么另一个尝试就是通过为类X提供重载而不是将X转换为其他类来反转它们的使用方式.
总是很好地考虑API的替代方法.