如何解决C ++与boost :: ptr_map / boost :: checked_delete交友失败
|| 我想在特定类中使用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
}
这到底是怎么回事?不行吗?我假设问题在于模板是在包含在模板中的编译单元中定义的,并且从bosst :: ptr_map的实现源中的另一个编译单元调用boost :: checked_delete。因此,它与我声明为朋友的功能不同。
但是,是否有解决此问题的方法?
解决方法
这是来自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个字符
, 声明朋友时,请尝试以下语法:
template <class T>
friend void boost::checked_delete(T*);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。