namespace A {
void F() {}
namespace B {
void F(int) {}
}
}
using A::B::F;
namespace A {
void G() {
F(); // OK
F(1); // Error: too many arguments to function void A::F()
}
}
int main() { return 0; }
我有这段代码。
我定义了两个名称相同但签名不同的函数。
然后我使用using声明using A::B::F
。
在A::G()
编译器尝试在A::F()
之前解析A::B::F()
。
如果发生此类冲突,是否有订单?
答案 0 :(得分:4)
首先搜索最深的嵌套范围,然后如果找不到名称则向外搜索范围。首先,它会在F
内找到G
的块范围声明,如果有的话;那么它会在A
的命名空间范围内找到一个声明,如果有的话;如果这也失败了,它将搜索全球范围。由于using A::B::F;
出现在全球范围内,因此始终会首先找到A::F
。也许您应该在using
内移动A
声明。
答案 1 :(得分:0)
这绝对是关于安置的。
namespace A {
void G() {
F(); // OK, A::F
using B::F;
F(1); // OK, A::B::F
}
}