1

我想在存储自身实例的特定类中使用 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 的实现源中的另一个编译单元调用的。所以,这与我声明为朋友的函数不同。

但是,是否有解决此问题的方法?

4

2 回答 2

2

声明朋友时尝试以下语法:

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

于 2011-06-15T07:22:54.060 回答
1

这是来自 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 个字符

于 2011-06-15T07:23:31.767 回答