2

コンテナアダプターを作成しようとしています。派生クラスの基本クラスの型定義も使用したいと思います。だから私は次のことを試しました...

template <class CONTAINER> class SequenceComposite {
protected:
    CONTAINER m_data;
public:
    typedef typename CONTAINER::size_type size_type;
    // ...
};

template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> > {
public:
    size_type capacity() const { m_data.capacity(); }
    // ...
};

このエラーが発生しました...

error: ‘size_type’ does not name a type  
note: (perhaps ‘typename SequenceComposite<std::vector<T> >::size_type’ was intended) // yes, it was

基本クラスのtypedefを使用することをコンパイラーに伝えるにはどうすればよいですか?

4

3 に答える 3

4

これを機能させることができました。これは、C ++テンプレートの依存名ルックアップに関する優れた記事でありの問題を修正する方法について説明しています。m_data

template <class DTYPE>
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> >     
{
public:
     typedef typename SequenceComposite< std::vector<DTYPE> >::size_type size_type ;

     size_type capacity() const
        {
          this->m_data.capacity() ;
        }
    // ...
};

または、次を使用することもできますusing

using typename SequenceComposite< std::vector<DTYPE> >::size_type ;

私はそれがそれをはるかに良くするとは思わないがjrok、さらに良い解決策を提案した:

 typename VectorComposite::size_type capacity() const
 {
    this->m_data.capacity() ;
 }
于 2013-03-11T13:08:02.470 に答える
2

派生型のコンテキストでは、size_typeは非依存名であるため、ベーステンプレートをインスタンス化せずに、テンプレートのコンテキストで検索されます。これを使用する必要がある場合、最も簡単な方法は、派生型でtypedefのクローンを作成することです。

typename VectorComposite::size_type size_type; // [*]

[*]元の誤ったコードに対するjrokの修正に続いて。

于 2013-03-11T13:09:00.940 に答える
1

このようにベースを置きsize_typeます:

typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //..
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
于 2013-03-11T12:58:01.067 に答える