考虑以下c ++代码

class A
{
public:
  void doStuff() {};
  void callStuff()
  {
    doStuff(true);
    doStuff();
  };
private:
  void doStuff(bool doIt = false) {};
};

int main()
{
  A a;
  a.doStuff();
  a.callStuff();

  return 0;
}


毫不奇怪,GCC在编译时会给出一些错误:

重载.cpp:在成员函数“ void A :: callStuff()”中:
重载.cpp:8:10:错误:重载的“ doStuff()”的调用不明确
  做东西();
          ^
重载.cpp:8:10:注意:候选人是:
重载.cpp:4:12:注意:void A :: doStuff()
       void doStuff(){};
            ^
重载.cpp:11:12:注意:无效A :: doStuff(bool)
       void doStuff(bool doIt = false){};
            ^
重载cpp:在函数“ int main()”中:
重载.cpp:17:17:错误:重载的“ doStuff()”的调用不明确
       a.doStuff();
                 ^
重载.cpp:17:17:注意:候选人是:
重载.cpp:4:12:注意:void A :: doStuff()
       void doStuff(){};
            ^
重载.cpp:11:12:注意:无效A :: doStuff(bool)
       void doStuff(bool doIt = false){};
            ^

我有几个问题:


如何告诉编译器我要使用哪个重载?我会被迫删除其中之一吗?
如果必须删除其中之一,如何在编译时发现此问题而不尝试调用重载?只要我不调用它们,一切都应该可以正常编译,因此以后我可能会发现无法调用试图添加的重载。
为什么第二个错误发生? main函数应该不能访问私有重载,因此它应该知道要使用哪个重载。

最佳答案

如何告诉编译器我要使用哪个重载?我会吗
  被迫删除其中之一?


您不能删除或重命名其中之一。


  如果必须删除其中一个,如何在以下位置找到此问题:
  编译时没有尝试调用重载?只要我不
  称他们一切应该编译良好,所以我可能只会发现
  后来我无法调用我添加的超载
  试图称呼它。


你也不能。仅当您尝试不使用任何参数调用成员函数时,才会检测到歧义。即使您可以执行一些编译时检查,也必须非常具体,并且删除或重命名其中一个重载会更容易。


  为什么第二个错误发生?主要功能不应该
  访问私有重载,因此它应该知道使用哪个。


不幸的是,在考虑访问说明符之前就发生了过载解析。因此,编译器甚至没有考虑到重载之一是私有的事实:甚至在重载发生之前就已经找到了歧义调用。我真的不知道为什么会这样发生,但这就是标准所说的。

关于c++ - 如何选择正确的过载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18501536/

10-12 03:33