Это не компилируется,
#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 (чего я еще не удосужился понять)?Помещает ли спецификатор друга определенную функцию в качестве свободной функции во вложенном пространстве имен?
edit
Кто бы ни удалил свой пост, функции-члены, не являющиеся друзьями, такие как add_ref
и release
(эти конкретные функции-члены не упоминаются в Документация ...) действительно решила проблему.Что происходит с вложенным определением с квалификатором friend
?