2012-01-06 126 views
3

這並不編譯,這裏發生了什麼?

#include <boost/intrusive_ptr.hpp> 

class X 
{ 
public: 
void intrusive_ptr_add_ref(X* blah) 
{ 
} 

void intrusive_ptr_release(X * blah) 
{ 
} 

}; 



int main() 
{ 
    boost::intrusive_ptr<X> ex(new X); 
} 

但這:

#include <boost/intrusive_ptr.hpp> 

class X 
{ 
public: 
    friend void intrusive_ptr_add_ref(X* blah) 
    { 
    } 

    friend void intrusive_ptr_release(X * blah) 
    { 
    } 

}; 



int main() 
{ 
    boost::intrusive_ptr<X> ex(new X); 
} 

這:

#include <boost/intrusive_ptr.hpp> 

    class X 
    { 
    public: 


    }; 


    void intrusive_ptr_add_ref(X* blah) 
     { 
     } 

     void intrusive_ptr_release(X * blah) 
     { 
     } 

int main() 
{ 
    boost::intrusive_ptr<X> ex(new X); 
} 

我想它是與SFINAE(這是我的天堂」 t仍然困擾着理解)? friend限定符是否將所定義的函數作爲一個自由函數放在封閉的命名空間中?

編輯

誰刪除其職,成員函數非友爲add_refrelease(這些特定的成員函數沒有在documention提到...)解決了問題。使用friend限定符的嵌套定義會發生什麼情況?

+0

你有什麼錯誤? – 2012-01-06 17:33:44

+0

關於編輯:您使用friend限定符定義的函數不是成員函數,它們是自由函數。他們在課堂上定義的事實並不能使他們成爲成員(我同意這可能會產生誤導)。 – 2012-01-06 17:42:55

+0

至於使用'add_ref'和'release'成員函數而不是免費函數,應該注意的是,這在Boost文檔中沒有明確說明(或者至少我沒有設法找到它)。 – 2012-01-06 17:46:52

回答

7

boost::intrusive_ptr文檔:

每一個新的intrusive_ptr例如通過使用不合格的調用函數intrusive_ptr_add_ref,傳遞給它的指針作爲參數遞增引用計數。同樣,當一個intrusive_ptr被銷燬時,它調用intrusive_ptr_release;這個函數負責在引用計數下降到零時銷燬對象。預計用戶將提供這兩個功能的合適定義。在支持參數相關查找的編譯器上,intrusive_ptr_add_ref和intrusive_ptr_release應該在與其參數對應的名稱空間中定義;否則,這些定義需要進入名稱空間增強。

這意味着intrusive_ptr_add_refintrusive_ptr_release不應該是成員函數,而是自由函數(好友函數的行爲如此)。此外,他們沒有資格被調用,所以他們應該在全局命名空間或ADL發現的某個地方。

編輯:你對與friend預選賽嵌套定義問題: friend功能定義爲非memberfunctions,所以friend void intrusive_ptr_add_ref(X* blah)將被稱爲intrusive_ptr_add_ref(my_x_ptr)而不是作爲my_x_ptr->intrusive_ptr_add_ref()

相關問題