2011-12-16 76 views
3

是否有一種方法可以在不使用::fully::qualified::namespace::name表單的情況下以C++回溯命名空間?回溯命名空間

考慮:

namespace f { 
    void p() { } 
    namespace g { 
     void p() { 
      [..]::p(); 
     } 
    } 
} 

是那裏的[..]的正確形式,除了完全限定它(即::f::p())? 目標是不是使用p(),因爲無限遞歸不是這裏的目標,同時也不使用FQ來節省空間。

+1

`˚F:: p`不_fully_限定它沒有明確的方法。例如, `namespace f {void p(); {namespace f {void p(){f :: p();}}}}`會導致無限遞歸,而`:: f :: p()`可能不會`f: :p`只是尋找最近的`f`,然後在任何找到的`f`中尋找`p`。在你的情況下`f :: p`是所需的最低限定條件。你不需要一個完整的`:` :f :: p`雖然在這種情況下沒有太多的收穫 – 2011-12-16 08:21:54

回答

3

名稱查找從內部作用域向外作用,因此您不必每次都從上到下進行查找。省略前導::可以有效地爲您查找回溯,直到找到您正在查找的名稱,因此f::p會有效回退,直至找到f,然後在f內查找p。您不需要完整的::f::p(),但在您的情況下,由於f位於全局名稱空間中,因此不存在巨大的鍵入差異。

考慮這個例子,其中調用::f::g::f::p()的保存更明顯。

namespace f { 
    void p(); 
    namespace g { 
     void p(); 
     namespace f { 
      void p(); 
      namespace h { 
       void p() 
       { 
        f::p(); // same as ::f::g::f::p() 
        ::f::p(); // fully qualified 
        g::p(); // same as ::f::g::p(); 
        p();  // recurse! 
       } 
      } 
     } 
    } 
} 

有強迫查找到exlcude直接範圍水平(塊或命名空間,沒有..::p()^::p()什麼。