Вы в основном спрашиваете почему вместо того, чтобы говорить "потому что язык так говорит", давайте покажем пример, когда ваше предложение приводит к провалу всего.
Предположим, у меня есть удобный класс в моем репозитории github:
struct HandyClass {
void display(short c) {
std::cout << c;
}
void doStuff() {
display(3);
}
};
А затем другой разработчик в другом репозитории github создает удобный набор функций отображения:
void display(double v) {
showWindowsPopup("Your score was %f", v);
}
void display(int v) {
showWindowsPopup("Your score was %d", v);
}
Вы загружаете оба репозитория, и внезапно, HandyClass больше не работает правильно:
#include "displays.h"
#include "handyclass.h"
int main() {
HandyClass a;
a.doStuff(); //Why does this show a windows popup!?!?
}
Поскольку вы сначала включили заголовки экрана, то display(3)
сопоставляется с ::display(int)
вместо ::HandyClass::display(short)
, поскольку 3
является int
. И возникает много печали.
Но с официальными правилами поиска C ++ этого не происходит. Поскольку мой класс имеет функции display
, он будет игнорировать функции вне класса, чтобы предотвратить ошибки, поэтому HandyClass
всегда делает одно и то же для всех.