为什么在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被吞噬了。 –
2011-04-18 17:37:44
VS 2010编译上面的代码,我相信这样做是正确的,但这是一个棘手的例子。很好的问题! – 2011-04-18 18:49:53
与VS2008一样,我只是检查它。这可能是GCC中的一个错误,或者它们的解释与微软的解释有什么不同?它没有名称空间的事实会指出它是一个错误,不是吗? – 2011-04-18 19:37:31