2014-04-14 68 views
3

爲什麼using ::foo聲明下面隱藏了所有其他foo函數?C++使用聲明

#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; 
} 
+0

這是在copy-swap成語中用於'std :: swap'的ADL查找。 http://stackoverflow.com/questions/4782692/what-does-using-stdswap-inside-the-body-of-a-class-method-implementation-mea – Brandon

+0

好的,但爲什麼B :: foo()不可訪問? –

+1

@BlazBratanic不是,你嘗試過'B :: foo()'嗎? – yizzlez

回答

1

在內部範圍內的任何函數聲明都隱藏了在外部範圍中具有相同名稱的函數的所有聲明。

您在功能噓聲功能::foo

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

它隱藏了所有的功能,在封閉範圍同名的區塊範圍內聲明。

更確切地說,根據C++標準

13由於使用聲明是聲明,上同名 聲明在相同的聲明性區域(3.3) 也適用於使用-聲明

的限制

或者,也許這將是更好的引用從C++標準

1 using聲明以下報價將使用德在 引入了一個名稱聲明區使用聲明:使用聲明中指定的成員名稱 在使用聲明出現的聲明區域 中聲明。