#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有关(我还没有想过要理解)? frIEnd限定符是否将已定义的函数作为自由函数放在封闭的命名空间中?
编辑
谁删除了他们的帖子,成员函数非朋友作为add_ref和release(documention中没有提到这些特定的成员函数……)确实解决了问题.使用好友限定符的嵌套定义会发生什么?
解决方法 从boost :: intrusive_ptr的文档:Every new intrusive_ptr instance increments the reference count by using an unqualifIEd call to the function intrusive_ptr_add_ref,passing it the pointer as an argument. Similarly,when an intrusive_ptr is destroyed,it calls intrusive_ptr_release; this function is responsible for destroying the object when its reference count drops to zero. The user is expected to provIDe suitable deFinitions of these two functions. On compilers that support argument-dependent lookup,intrusive_ptr_add_ref and intrusive_ptr_release should be defined in the @R_404_6889@space that corresponds to their parameter; otherwise,the deFinitions need to go in @R_404_6889@space boost.
这意味着intrusive_ptr_add_ref和intrusive_ptr_release不应该是成员函数,而是自由函数(友元函数就像这样).此外,它们在没有限定条件的情况下被调用,因此它们应该位于全局命名空间或ADL找到的某个位置.
编辑:关于使用朋友限定符的嵌套定义的问题:友元函数被定义为非成员函数,因此朋友voID intrusive_ptr_add_ref(X * blah)将被称为intrusive_ptr_add_ref(my_x_ptr)而不是my_x_ptr-> intrusive_ptr_add_ref().
总结以上是内存溢出为你收集整理的c – 这里发生了什么?全部内容,希望文章能够帮你解决c – 这里发生了什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)