1

我正在尝试创建枚举类型到工厂对象的映射,但无法获得似乎在 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<_Container,_Traits>”的成员

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

谁能告诉我为什么这不起作用并可能分享修复或解决方法?谢谢。

4

1 回答 1

1

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

boost::call_once当然,这与您的静态初始化不兼容......除了(来自Boost.Thread)之外,我在这里并没有一个好主意。有ptr_list_of,但不支持ptr_map。你可以试试自己写,没那么复杂。

于 2013-07-01T19:03:51.590 回答