![]() |
1. Koenig lookup | ||
Какой будет результат, если попытаться откомпилировать, слинковать и выполнить следующую программу: |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> namespace ns1 { struct base { }; void foo(base&) { std::cout << "ns1::foo" << std::endl; } } namespace ns2 { struct derived : public ns1::base { }; void foo(ns1::base&) { std::cout << "ns2::foo" << std::endl; } } int main() { ns2::derived drv; foo(drv); return 0; } |
На самом деле, вопрос очень простой, если вы знаете, как происходит поиск имен. Если же вы сомневаетесь, то предлагаю ознакомиться с правильным ответом. | ||
Результатом будет ошибка компиляции. Дело в том, что вызов подходит для обоих пространств имен. Поиск подходящей функции происходит не только в пространстве имен, где определен тип параметра функции, но и в пространствах, в которых определены все звенья цепочек родительских типов параметра. Если тип параметра имеет десять предков, каждый из которых определен в своем пространстве имен, поиск подходящей функции будет осуществляться во всех десяти пространствах. |
|
Статистика |
|