Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称空间中函数的阴影_C++_Namespaces_Method Hiding - Fatal编程技术网

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)
在同一名称空间中声明,因此其他规则适用于此。看见