Я хочу использовать boost :: ptr_map внутри определенного класса, который хранит свои экземпляры. Однако, пожалуйста, рассмотрите следующий пример:
#include <boost/checked_delete.hpp>
#include <boost/ptr_container/ptr_map.hpp>
class foo
{
friend void boost::checked_delete<>(foo*);
~foo() {}
};
int main()
{
boost::checked_delete(new foo); // OK
boost::ptr_map<int, foo> foo_map; // error C2248: 'foo::~foo' : cannot access private member declared in class 'foo'
return 0;
}
Ошибка происходит в следующей строке
// verify that types are complete for increased safety
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x; // error C2248
}
Что именно здесь происходит? Разве это не должно работать? Я предполагаю, что проблема в том, что шаблоны определены в модуле компиляции, в который они включены, и boost :: checked_delete вызывается из другого модуля компиляции в источнике реализации bosst :: ptr_map. Так что это не та функция, которую я объявил как друг.
Однако есть ли решение этой проблемы?