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