Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныЗаметкиВопрос-ответКнигорецензииСправочная

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;
}
Компилировать в Comeau
На самом деле, вопрос очень простой, если вы знаете, как происходит поиск имен. Если же вы сомневаетесь, то предлагаю ознакомиться с правильным ответом.
Результатом будет ошибка компиляции. Дело в том, что вызов подходит для обоих пространств имен. Поиск подходящей функции происходит не только в пространстве имен, где определен тип параметра функции, но и в пространствах, в которых определены все звенья цепочек родительских типов параметра. Если тип параметра имеет десять предков, каждый из которых определен в своем пространстве имен, поиск подходящей функции будет осуществляться во всех десяти пространствах.

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

Недвижимость москва, новостройки москвы. Палатка сфера 4 Normal. модные сумки из италии