在C ++中使用声明

时间:2015-04-21 17:09:12

标签: c++ namespaces

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()

如果发生此类冲突,是否有订单?

2 个答案:

答案 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
  }
}