0

残念ながら、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;
};

エラーが発生しました

「typedef typename tableCreator::const_iterator citerTc;」の「エラー: 'tableCreator' の前にネストされた名前指定子が必要です」ライン。4.1.2 g++ を使用しています。」

申し訳ありませんが、ここで「syam が指す」タイプ名を見逃しており、citerTc の定義でテンプレートを削除しました。これで、コードがコンパイルされ、正常に実行されます。皆様、ご協力ありがとうございました。

4

1 に答える 1

3

修飾された依存型名があるため、曖昧さ回避ツールを使用して、コンパイラに(データ メンバーではなく) 型の名前として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;
//                            ^^^^^^^^
于 2013-05-06T15:16:14.733 に答える