【问题标题】:C++ Befriending boost::ptr_map / boost::checked_delete failsC++ 友好 boost::ptr_map / boost::checked_delete 失败
【发布时间】: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


【解决方案1】:

在声明朋友时试试这个语法:

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

【讨论】:

  • 最明确(更可取)的语法是friend void boost::checked_delete&lt;&gt;(foo*);friend void boost::checked_delete&lt;foo&gt;(foo*);。这就是我使用它的原因。但是感谢您的方法。
  • 评论是正确的,问题中的语法适合单个模板实例化,而建议的解决方案适合所有实例化,这可能是有问题的。考虑阅读thisthis 对不同问题的其他答案。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。对不起,因为没有提到,但我已经注意到了。如果添加 const 修饰符,它将起作用,但我认为这可能不太便携(我使用的是 MSVC 10.0)。还是保证是const?
  • @FrEEzE2046 与其说是可移植性问题,不如说是使用boost::checked_delete 的代码的作用:将指针传递给const 或不传递给它。因此,您必须查看ptr_map 的文档,看看是否有任何保证。
  • @FrEEze2046:如果您返回阅读错误消息,它会告诉您库的作用,这与您使用的编译器无关。
  • 难道不能用所有可能的修饰符让“checked_delete”成为 foo 的朋友吗?
  • @FrEEzE2046 不;它要么是整个模板,要么是选择专业。无法将 cv 限定表示为模板特化(即匹配任何 cv foo),并且无论如何都不允许对函数模板进行部分特化。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多