C++ 名称空间中函数的阴影
假设您有以下代码C++ 名称空间中函数的阴影,c++,namespaces,method-hiding,C++,Namespaces,Method Hiding,假设您有以下代码 namespace a{ struct S{}; //void f(int){} } namespace b{ struct T{}; } struct X{}; void f(X){} void f(b::T){} void f(a::S){} namespace a{ void g(){ S s;b::T t; X x; f(x); f(s); f(t); } } int main(){
namespace a{
struct S{};
//void f(int){}
}
namespace b{
struct T{};
}
struct X{};
void f(X){}
void f(b::T){}
void f(a::S){}
namespace a{
void g(){
S s;b::T t;
X x;
f(x);
f(s);
f(t);
}
}
int main(){
a::g();
}
如果在命名空间a中定义了void f(int){}
(第3行未注释),则它会隐藏void f(b::T){}
和void f(a::S){}
,而不是void f(X){
。
为什么?它会调用f(char)
和f(int)
,因为char可以隐式转换为int。
编辑
命名空间A中有函数f(int)
。全局命名空间中有函数f(A::S)
。我们试图从函数g调用f(s),其中s是A::s
,它位于命名空间A
,编译器发现,该函数应应用s(A::s)
,但命名空间A
中没有这样的函数,所以编译器停止并给出错误。
全局命名空间中有函数f(B::T)
。尝试在命名空间A(f(int))
和命名空间B中查找(因为arg type位于命名空间B中),未找到任何内容,编译器停止。
在全局名称空间中有函数f(X)
,X
在全局名称空间中,查看名称空间A(f(int))
和全局名称空间(查找f(X)
)-一切正常。
更多信息请阅读C++标准的PAR 3.4.2(草案N33 37)。或者,更简单地说,我认为它确实隐藏了外部的
f
,并且f(c)
在同一名称空间中使用f(int)
。同样的事情发生在charNo的struct X instread上,这是另一回事。如果参数和函数在同一名称空间(包括全局名称空间)中声明,则仍然可以找到该函数。@BoPersson谢谢!!这正是重点@波普森:如果你把它作为一个答案来写,我会把它标记为最终答案。事实上,名称空间c{struct Y{};void f(Y){}和f(Y)工作谢谢。我对代码进行了修改,以表明对于不可转换为Int的结构,也会发生同样的情况。您是否知道为什么它不会对f(X)进行阴影处理?但是struct X
与f(X)
在同一名称空间中声明,因此其他规则适用于此。看见