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++大師,處理這個問題的正確方法是什麼?
你是對的;這確實有用。我正在閱讀的其中一個文檔明確表示,朋友函數必須位於boost命名空間(由我鏈接的示例支持),所以我認爲它是理所當然的。不知道爲什麼我沒有儘早嘗試。謝謝! – trbabb
這裏的關鍵字是「依賴於參數的查找」(通常稱爲Koenig的查找或者僅僅是ADL)。有一個谷歌,這是值得理解爲什麼這樣的功能存在於C++和它的工作原理。 – Kos