考虑以下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/