Почему это не скомпилируется с 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, поэтому переупорядочение не является возможным.