Почему это не удается скомпилировать с помощью 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, поэтому переупорядочение не является вариантом.
Опечатка! был проглочен HTML. –
VS 2010 компилирует приведенный выше код, и я считаю, что это правильно, но это сложный пример. Хороший вопрос! –
То же самое с VS2008, я только что проверил. Может ли это быть ошибкой в GCC или их интерпретация просто отличается от Microsoft? Тот факт, что он работает без пространства имен, указывает на то, что он является ошибкой, не так ли? –