假设您有以下代码
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){}
。
为什么呢?
答案 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