8

CRPに関して、(テンプレート テンプレート パラメータを使用して) わずかなバリエーションを実装したい場合、コンパイル エラーが発生します。

template <template <typename T> class Derived>
class Base
{
public:
    void CallDerived()
    {
        Derived* pT = static_cast<Derived*> (this);
        pT->Action(); // instantiation invocation error here
    }
};

template<typename T>
class Derived: public Base<Derived>
{
public:
    void Action()
    {
    }
};

ただし、これを使用する代わりに、このフォームを選択するかどうかは正確にはわかりません (これは私のためにコンパイルされません) (これは機能します)。

template <typename Derived>
class Base
{
public:
    void CallDerived()
    {
        Derived* pT = static_cast<Derived*> (this);
        pT->Action();
    }
};

template<typename T>
class Derived: public Base<Derived<T>>
{
public:
    void Action()
    {
    }
};
4

2 に答える 2

11

これもコンパイルする必要があります。明示的に指定された他のテンプレート パラメータを取得するだけです。

 template <typename T, template <typename T> class Derived>
 class Base
 {
 public:
     void CallDerived()
     {
        Derived<T>* pT = static_cast<Derived<T>*> (this);
        pT->Action(); // instantiation invocation error here
     }
 };

template<typename T>
class Derived: public Base<T,Derived>
{
public:
    void Action()
    {
    }
};
于 2012-04-29T18:25:49.910 に答える
5

最初の例では、あなたが書いたように、クラス テンプレートは実際にはtemplate parameterだけでなく、template template parameterを取ります。

template <template <typename T> class Derived>
class Base
{
     //..
};

したがって、このコードは意味がありません。

Derived* pT = static_cast<Derived*> (this);
pT->Action(); // instantiation invocation error here

これDerivedは、提供していないテンプレート引数を必要とするテンプレート テンプレート引数です。実際、関数では、意図したことを行うために、関数に提供する必要があるCallDerived()を知ることはできません。

2 番目のアプローチが正しい解決策です。これを使って。

于 2012-04-29T18:19:14.350 に答える