重载命名空间中的函数模板
为什么 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 不同的头文件,因此不能选择重新排序。
Why does this fail to compile with 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;
}
It must have something to do with the namespace of do_it
. When I remove the namespace around it, it compiles.
Background: I am building a set of functions that may be used with many different container classes. To handle the different interfaces uniformly I use freestanding functions that are overloaded for each of the container classes. These functions shall be put into a namespace to avoid cluttering the global namespace with them.
The definitions for B shall be thought of as coming from a different header file than those for A so reordering is not an option.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原因是在调用时只完成了 ADL。其他函数查找仅在
myfun
函数模板的定义中完成。在该定义上下文中,仅声明接受
A
的do_it
重载。编辑:如果您想获得这方面的标准参考,请参阅 [temp.dep.candidate] 和 [temp.res]p1。
The reason is that only ADL is done at the point of the call. Other function lookups are only done in the definition of the
myfun
function template.And at that definition context, only the
do_it
overload accepting theA<int>
is declared.Edit: If you want to have a Standard reference for this, refer to [temp.dep.candidate] and [temp.res]p1.