为什么这段代码在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不同的头文件,因此重新排序不是一个选项。