创建模板时的编译错误& boost :: shared_ptr基于通用工厂

时间:2013-05-06 15:10:17

标签: c++ templates boost shared-ptr factory

遗憾的是我正在使用c ++ 98。

template <class bT>
class Creator
{
public:
   virtual bT* create()  = 0;
};

template <class bT>
struct CreatorPtr
{
    typedef boost::shared_ptr< Creator<bT> > ptr;
};

template <class bT, class cT>
class CreatorImpl : public Creator<bT>
{
public:
   virtual bT* create() { return new cT; }
};

template <class bT>
class Factory
{
public:
    virtual bT* create(const std::string& name) = 0;
    virtual ~Factory() { _table_creator.clear(); }
protected:
    Factory() {}
    Factory(const Factory&) {}
    Factory &operator=(const Factory&) { return *this; }
    void registerCreator(const std::string& name, typename CreatorPtr<bT>::ptr creator)
        { _table_creator[name] = creator; }
    typedef std::map<std::string, typename CreatorPtr<bT>::ptr> tableCreator;
    typedef typename tableCreator::const_iterator citerTc;
    ......
protected:
    tableCreator _table_creator;
};

我收到了错误

  

“错误:'tabledef typename tableCreator :: const_iterator citerTc;'中'tableCreator'之前的预期嵌套名称说明符”线。我正在使用4.1.2 g ++。“

对不起大家,我在这里错过了“syam指向”的类型名称,并删除了citerTc定义中的模板。现在代码编译并运行良好。 谢谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

由于您具有合格的依赖类型名称,因此需要使用typename消歧器来告诉编译器将::之后的内容解释为类型的名称(而不是数据)构件):

    typename CreatorPtr<bT>::ptr // ptr is the name of a type, so you need
//  ^^^^^^^^                     // to use the "typename" keyword in order
                                 // to let the compiler parse it correctly

例如:

void registerCreator(const std::string& name,
                     typename CreatorPtr<bT>::ptr creator)
//                   ^^^^^^^^

类似地:

typedef std::map<std::string, typename CreatorPtr<bT>::ptr> tableCreator;
//                            ^^^^^^^^