【发布时间】:2014-04-14 19:45:48
【问题描述】:
为什么下面的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;
}
【问题讨论】:
-
这与用于复制交换习语中的
std::swap的ADL 查找相同。 stackoverflow.com/questions/4782692/… -
好的,但是为什么 B::foo() 无法访问?
-
@BlazBratanic 不是,你试过
B::foo()吗? -
你是对的。但是,为什么我需要明确指定哪个 foo 函数?在这种情况下,
using声明的全部意义都丢失了,因为我也可以调用::foo(1.0)、A::foo(1.0f)等。 -
@crashmstr:可能适用于这种情况,但是当您真的希望编译器选择时,请尝试使用足够的模板。
标签: c++