Два пространства в C++
При двух пользовательских типах в списке параметров поиск, зависящий от аргумента смотрит пространства имен обоих аргументов.
Если одноименная функция лежит в каждом из них, неквалифицированный вызов может стать неоднозначным. Безопасный прием - оставить перегрузку в одном пространстве и явно указать другое имя там, где нужна вторая версия.
Объявим типы в East и West,
функцию join только в East
и успешный вызов из main:
#include <iostream>
namespace East {
struct Node {};
}
namespace West {
struct Leaf {};
}
namespace East {
void join(East::Node, West::Leaf) {
std::cout << "east\n";
}
}
namespace West {
void mark(West::Leaf) {
std::cout << "west\n";
}
}
int main() {
East::Node node{};
West::Leaf leaf{};
join(node, leaf);
West::mark(leaf);
return 0;
}
Создайте Alpha::Token и Beta::Flag.
Объявите match только в Alpha,
печатающую ok. Вызовите match
без квалификатора и отдельно Beta::match,
если добавите вторую версию там.
Для Ship::Hull и Port::Dock
задайте moor в Ship.
Проверьте неквалифицированный вызов
и выведите строку, которую печатает
найденная функция.