6

我有几个可以隐式转换为字符串的类字符串类。我对这些有一些用途;一个例子是通过gettext保存需要在运行时翻译的文本:

class TranslatableString
{
public:
  explicit TranslatableString(const char *s) : native_text_(s) {}
  operator const char *() const { return gettext(native_text_); }

  // Or not - see below:
  operator const std::string() const { return gettext(native_text_); }

private:
  const char * const native_text_;
};

现在我试图使使用这个类尽可能简单(即,使用它应该尽可能像字符串文字)。特别是,我希望以下两种示例用法都能正常工作:

const TranslatableString HELLO = TranslatableString("Hello, world!");

std::string ExampleA() {
  return HELLO;
}

void ExampleB() {
  std::string s;
  s = HELLO;
}

有什么办法可以让这两个例子都起作用吗?

  • 如果我 include operator std::string,则 ExampleB 无法编译,说std::string::operator=(const char *)and之间存在歧义std::string operator=(const std::string&)(这是有道理的)。
  • 如果我不包含operator std::string,则 ExampleA 无法编译;显然不允许将 TranslatableString 隐式转换为 const char * 到 std::string,尽管我不太了解 C++ 的隐式转换规则来解释原因。
4

2 回答 2

5

每个转换序列中只允许一个用户定义的转换,这就是你不能“通过” a 的原因const char*。(注意const char*tostd::string也是用户定义的转换)。

您需要转换为const char*吗?没有它(并且覆盖到std::string),这两个例子都可以工作。

可能还值得考虑将数据存储为std::string内部,而不是const char*. 您不必担心释放问题、数据在您手下“消失”等。

于 2013-04-05T15:52:59.457 回答
1

你将不得不放弃拥有operator const char *. 制作它explicit(C ++ 11)或将其作为c_str方法提供。

不允许转换TranslatableStringconst char *to,因为它包含两个用户定义的转换。std::string

于 2013-04-05T15:53:33.673 回答