C ++: добавление друзей в boost :: ptr_map / boost :: checked_delete завершается неудачно - PullRequest
1 голос
/ 15 июня 2011

Я хочу использовать 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. Так что это не та функция, которую я объявил как друг.

Однако есть ли решение этой проблемы?

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Попробуйте этот синтаксис при объявлении друга:

template <class T> friend void boost::checked_delete(T*);

1 голос
/ 15 июня 2011

Вот начало огромного сообщения об ошибке * от GCC, которое является началом цепочки создания экземпляров (обычно и в этом случае):

В файле из main.cpp: 1: 0: main.cpp: В функции 'void boost :: checked_delete (T *) [with T = const foo]':

Добавление

friend void boost::checked_delete<>(foo const*);

делает код компилируемым.

(*): 13 строк и 3510 символов для 270 символов / строка

...