【发布时间】:2011-06-15 07:10:58
【问题描述】:
我想在存储自身实例的特定类中使用 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 的实现源中的另一个编译单元调用的。所以,这与我声明为朋友的函数不同。
但是,有解决此问题的方法吗?
【问题讨论】:
-
添加您得到的确切编译器错误,它通常包含有关单个错误代码未显示的幕后情况的信息。
标签: c++ boost friend boost-ptr-container