命名空间中的函数阴影

时间:2012-08-13 08:58:40

标签: 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(){
  a::g();
}

如果在命名空间a中定义void f(int){}(第3行未注释),则会隐藏void f(b::T){}void f(a::S){}的后续定义,但不会隐藏void f(X){}。 为什么呢?

1 个答案:

答案 0 :(得分:3)

将调用阴影f(char)f(int),因为char可以隐式地转换为int。 http://liveworkspace.org/code/8d7d4e0bc02fd44226921483a910a57b

EDIT。

命名空间A中有函数f(int)。全局命名空间中有函数f(A::S)。我们试图从函数g中调用f({s} {s} A::S,编译器发现,该函数应该应用S A,但是没有这样的函数在命名空间(A::S)中,编译器停止并给出错误。 http://liveworkspace.org/code/5f989559d2609e57c8b7a655d5b1cebe

全局命名空间中有函数A。试图在命名空间A f(B::T)和命名空间B中找到(因为arg-type在命名空间B中),没有任何结果,编译器停止。 http://liveworkspace.org/code/4ebb0374b88b29126f85038026f5e263

全局命名空间中有函数(f(int)),全局命名空间中有f(X),查看命名空间A X和全局命名空间(查找(f(int))) - 一切都还可以。 http://liveworkspace.org/code/c9ef24db2b5355c4484aa99884601a1a

有关详细信息,请参阅C ++标准(草案n3337)的第3.4.2节。或者,更简单地http://en.wikipedia.org/wiki/Argument-dependent_name_lookup