2011-08-16 61 views
4

具體來說,我需要聲明(據我所知)intrusive_ptr_{add_ref,release}作爲我引用類的朋友:使用boost :: intrusive_ptr與嵌套類

#include <boost/intrusive_ptr.hpp> 
using boost::intrusive_ptr; 

class Outer { 
public: 

    //user-exposed interface goes here 

protected: 
    class Inner { 
    public: 
     Inner():refct(0){} 
     virtual ~Inner(){} 

     //machinery goes here 

     size_t refct; 
    }; 

    friend void boost::intrusive_ptr_release(Inner *p); 
    friend void boost::intrusive_ptr_add_ref(Inner *p); 

    intrusive_ptr<Inner> handle; 

}; 

namespace boost { 

    void intrusive_ptr_release(Outer::Inner *p){ 
     if ((p->refct -= 1) <= 0){ 
      delete p; 
     } 
    } 

    void intrusive_ptr_add_ref(Outer::Inner *p){ 
     p->refct++; 
    } 

}; 

我無法找到正確的語法,以這編譯並保留我想要的訪問。我的主要問題是,gcc似乎很不高興「boost :: intrusive_ptr_release(Outer :: Inner * p)應該在名稱空間增強中聲明」。

我從this example看到intrusive_ptr傭工向前命名空間boost--的內部聲明,但我不能向前聲明它們,因爲據我瞭解,嵌套類(即「內」,這些功能的參考到)只能在裏面宣告的外部類別,這也是朋友聲明必須去的地方。

O更大的C++大師,處理這個問題的正確方法是什麼?

回答

5

您不必將它們放在namespace boost中,您可以將它們放在與class Outer相同的命名空間中,並且可以通過依賴於參數的查找來找到它們。

每一個新的intrusive_ptr例如通過使用不合格調用該函數intrusive_ptr_add_ref,傳遞給它的指針作爲參數遞增引用計數。

+0

你是對的;這確實有用。我正在閱讀的其中一個文檔明確表示,朋友函數必須位於boost命名空間(由我鏈接的示例支持),所以我認爲它是理所當然的。不知道爲什麼我沒有儘早嘗試。謝謝! – trbabb

+0

這裏的關鍵字是「依賴於參數的查找」(通常稱爲Koenig的查找或者僅僅是ADL)。有一個谷歌,這是值得理解爲什麼這樣的功能存在於C++和它的工作原理。 – Kos