Перегрузка шаблонов функций в пространствах имен - PullRequest
8 голосов
/ 18 апреля 2011

Почему это не скомпилируется с GCC 4.4?

template<typename T>
class A {
public:
    void foo () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (A<T> a) {
    a.foo ();
}
};

template<typename T>
void myfun (T x) {
    Ns::do_it (x);
}

template<typename T>
class B {
public:
    void bar () {

    }

private:
    T x;
};

namespace Ns {
template<typename T>
void do_it (B<T> b) {
    b.bar ();
}
};

int main () {
    A<int> a;
    B<int> b;

    myfun (a);
    myfun (b); // error: no matching function call to do_it(B<int>&)

    return 0;
}

Это должно быть как-то связано с пространством имен do_it. Когда я удаляю пространство имен вокруг него, оно компилируется.

Справочная информация: я создаю набор функций, которые могут использоваться со многими различными классами контейнеров. Для равномерной обработки различных интерфейсов я использую автономные функции, которые перегружены для каждого из классов контейнеров. Эти функции должны быть помещены в пространство имен, чтобы не загромождать им глобальное пространство имен.

Определения для B следует рассматривать как полученные из файла заголовка, отличного от определений для A, поэтому переупорядочение не является возможным.

1 Ответ

6 голосов
/ 18 апреля 2011

Причина в том, что в точке вызова выполняется только ADL.Поиск других функций выполняется только в определении шаблона функции myfun.

И в этом контексте определения объявляется только перегрузка do_it, принимающая A<int>.

Редактировать: если вы хотите иметь стандартную ссылку для этого, обратитесь к [temp.dep.candidate] и [temp.res] p1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...