boost :: assign,ptr_map和多态类

时间:2013-07-01 18:11:40

标签: c++ boost

我正在尝试创建枚举类型到工厂对象的映射,但是无法获得在MSVC9上编译似乎有效的代码(使用C ++ 03 ):

namespace detail {
    class INoteCreator
    {
    public:
        virtual ~INoteCreator() {}
        virtual Note* create( DBHANDLE ) const {}
        virtual Note* clone( DBHANDLE, Note const& ) const {}
    };

    template<class T>
    class NoteCreator : public INoteCreator
    {
    public:
        virtual Note* create( DBHANDLE h ) const
        {
            return new T( h );
        }

        virtual Note* clone( DBHANDLE h, Note const& n ) const
        {
            return new T( h, static_cast<T const&>(n) );
        }
    };

    typedef boost::ptr_map<Note::Type, INoteCreator> Container;
    static Container mapping = boost::assign::map_list_of<Note::Type, INoteCreator*>
        (Note::COMPOSITE_NOTE, new NoteCreator<Note>())
        (Note::HTML_NOTE, new NoteCreator<HtmlNote>())
        (Note::MIME_NOTE, new NoteCreator<MimeNote>())
        ;
}

我得到的错误:

  

错误C2039:'base':不是。的成员   'stlpd_std :: PRIV :: _ DBG_iter&LT; _container,_Traits&GT;'

     

错误C2512:   'boost :: ptr_container_detail :: ref_pair':没有合适的默认值   可用的构造函数

任何人都可以告诉我为什么这不起作用并且可能共享修复或解决方法?感谢。

1 个答案:

答案 0 :(得分:1)

map_list_of不适用于Boost.PtrContainer。你不能在这里使用list_of语法;你必须使用ptr_map_insert()。它具有异常安全的优点,您当前的代码不是。

当然这与你的静态初始化不兼容......除了boost::call_once(来自Boost.Thread),我真的没有好主意。有ptr_list_of,但它不支持ptr_map。你可以尝试自己编写,但这并不复杂。