Вопрос по c++ – Любопытно повторяющийся шаблон - вариация

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()
    {
    }
};

Ваш Ответ

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()
    {
    }
};
Error: User Rate Limit Exceeded Ghita
Error: User Rate Limit Exceeded Ghita
5

template template parameter, не простоtemplate parameter, как вы написали:

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

Таким образом, этот код не имеет смысла:

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

ВотDerived является аргументом шаблона шаблона, который нуждается в аргументе шаблона, который вы ему не предоставили. На самом деле, вCallDerived() функция, вы не можете знатьtype Вы должны предоставить ему, чтобы делать то, что вы собираетесь делать.

Второй подход - правильное решение. Используй это.

Error: User Rate Limit Exceeded Ghita
Error: User Rate Limit ExceededT Action();Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededTError: User Rate Limit ExceededTError: User Rate Limit Exceeded

Похожие вопросы