C++ using声明

4
为什么下面的 using ::foo 声明会隐藏所有其他的 foo 函数呢?
#include <iostream>

void foo(double) { std::cout << "::foo(double)" << std::endl; }

struct A {
  void foo(float) { std::cout << "A::foo(float)" << std::endl; }
  void foo(int) { std::cout << "A::foo(int)" << std::endl; }
  void foo() { std::cout << "A::foo()" << std::endl; }
};

struct B : A {
  using A::foo;
  void foo(int) { std::cout << "B::foo(int)" << std::endl; }
  void foo() { std::cout << "B::foo()" << std::endl; }

  void boo() {
    using ::foo;
    foo(1.0);
    foo(1.0f);
    foo(1);
    foo();
  };
};

int main() {
  B b;
  b.boo();
  return 0;
}

好的,但为什么B :: foo()不可访问? - Blaz Bratanic
1
@BlazBratanic,不是这样的,你试过B::foo()了吗? - yizzlez
我认为你还需要执行 using B::foo; - Deduplicator
using 是一种方便的方法。当你有冲突或需要指定作用域时,不要使用它!而且,using ::foo; 的意义是什么,除了让 foo 成为 ::foo 之外? - crashmstr
1
@crashmstr:这种情况可能有效,但如果你有足够多的模板,并且真正希望编译器进行选择时,请尝试一下。 - Deduplicator
显示剩余2条评论
1个回答

2
在内部作用域中声明函数会隐藏外部作用域中具有相同名称的所有函数声明。 您在函数boo的块级作用域中声明了函数::foo
  void boo() {
    using ::foo;
    foo(1.0);
    foo(1.0f);
    foo(1);
    foo();
  };

它隐藏了在封闭作用域内具有相同名称的所有函数。

更确切地说,根据C++标准:

13 由于using声明是一个声明,因此对于在同一声明区域(3.3)中具有相同名称的声明也适用于using声明的限制。

或者可能最好引用来自C++标准的以下引用:

1 使用声明将名称引入出现使用声明的声明区域。使用声明:在using声明中指定的成员名称在using声明出现的声明区域中声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接