1

子クラスにテンプレート化された基本クラス(Base)を継承する子クラス(Child)があります。子クラスも型のテンプレートです(整数など)。基本クラスでこの型にアクセスしようとしていますが、多くのことを試しましたが成功しませんでした...これが私が思うことです実用的なソリューションに近いかもしれませんが、コンパイルされません...

template<typename ChildClass>
class Base
{
    public: 
        typedef typename ChildClass::OtherType Type;

    protected:
        Type test;
};

template<typename TmplOtherType>
class Child
    : public Base<Child<TmplOtherType> >
{
    public:
        typedef TmplOtherType OtherType;
};

int main()
{
    Child<int> ci;
}

これがgccが私に言うことです:

test.cpp:「Base>」のインスタンス化:test.cpp:14:7:
「Child」からインスタンス化test.cpp:23:16:ここからインスタンス化test.cpp:7:48:エラー:「notype」という名前のタイプ'classChild'のOtherType'</p>

これは同等の実用的なソリューションです:

template<typename ChildClass, typename ChildType>
class Base
{
    public:
        typedef ChildType Type;

    protected:
        Type test;
};

template<typename TmplOtherType>
class Child 
    : public Base<Child<TmplOtherType>, TmplOtherType>
{
    public:
};

しかし、私を悩ませているのは、反復テンプレートパラメーター(TmplOtherTypeをChildtypeとして転送する)を基本クラスに転送することです...

皆さんはどう思いますか ?

4

1 に答える 1

2

テンプレートテンプレートパラメータを使用して、繰り返しのテンプレート引数を回避できます。

template<template<typename>class ChildTemplate, //notice the difference here
          typename ChildType>
class Base
{
  typedef ChildTemplate<ChildType>  ChildClass; //instantiate the template
  public:
    typedef ChildType Type;

  protected:
    Type test;
};

template<typename TmplOtherType>
class Child 
    : public Base<Child, TmplOtherType> //notice the difference here also
{
    public:
};
于 2012-09-19T09:00:26.073 に答える