如何避免`operator [](const char *)`歧义?

时间:2017-05-01 19:30:15

标签: c++

这已经解释过here,但“回答”只是解释为什么会发生这种情况,而没有关于如何解决问题的建议。

请考虑以下代码:

class DictionaryRef {
public:    
  operator bool() const;
  std::string const& operator[](char const* name) const;

  // other stuff
};

int main() {
  DictionaryRef dict;
  char text[256] = "Hello World!";

  std::cout << dict[text] << std::endl;
}

使用G ++编译时会产生以下警告:

warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
note: candidate 1: const string& DictionaryRef::operator[](const char*) const
note: candidate 2: operator[](long int, char*) <built-in>

我知道这意味着什么,但是我正在寻找一种方法来确保正确的行为/解决警告而不改变我的类设计 - 因为对于类来说,同时具有布尔转换和{{{ 1}} operator。

除了生成随机编译器警告之外,[](const char*)的目的是什么?我无法想象有人在真实的代码中写operator[](long int, char*)

1 个答案:

答案 0 :(得分:0)

尽管您“无法想象有人用真实的代码编写Patch”,但由于从C继承了可交换的1["hello"],这是合法的C ++。无论合理与否,语言的定义方式,对我们来说不太可能会改变。

避免模棱两可的最佳方法是将[]添加到布尔转换中-很少有人想要非显式的explicit

另一种方法是将operator bool()替换为operator bool(),这仍然可以满足布尔测试,但不能转换为整数。