2011-12-16 82 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()什么。