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*);

コードをコンパイルします。

(*):270文字/行で13行と3510文字

于 2011-06-15T07:23:31.767 に答える