Здравствуйте, i-gen, Вы писали:
IG>Дело в том, что Вы внутри метода B::deleter обращаетесь к глобальному оператору delete который пытается вызвать деструктор A::~A — а это ему не позволено (деструктор не public, а оператор delete не член классов A или B.
Совершенно неверно. Не нужно путать выражение delete (delete expression) и оператор delete. Оператор delete никаких деструкторов не вызывает, его дело — освободить память. Работу по вызову деструктора и последующему вызову operator delete выполняет выражение delete, и делается все это в контексте использования, т.е. в данном случае в контексте метода B::deleter.
IG>Решением могло бы быть определение оператора delete (как члена) внутри класса A (а вместе с ним определять и симметричный оператор new).
Это решение к настоящей проблеме никак не относится.
IG>Еще одним (возможным) решением было бы добавить в класс A запись: friend operator delete (так не пользовал — не уверен, что верно)
Правильно, что не уверен. Неверно это.