6

暗黙的に文字列に変換できる文字列のようなクラスがいくつかあります。これらにはいくつかの用途があります。1 つの例は、実行時に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;
}

両方の例を機能させる方法はありますか?

  • を含めると、 ExampleB はコンパイルに失敗し、 と の間にoperator std::stringあいまいさがあると言って(これは理にかなっています)。std::string::operator=(const char *)std::string operator=(const std::string&)
  • を含めないoperator std::stringと、ExampleA はコンパイルに失敗します。TranslatableString を const char * から std::string に暗黙的に変換することは明らかに許可されていませんが、C++ の暗黙的な変換規則を十分に理解していないため、理由を説明できません。
4

2 に答える 2

1

を持つことをあきらめなければならないでしょうoperator const char *。作成するexplicit(C++11) か、c_str代わりにメソッドとして提供してください。

2 つのユーザー定義の変換が含まれているTranslatableStringため、 toconst char *への変換は許可されていません。std::string

于 2013-04-05T15:53:33.673 に答える