C ++: ошибка аргумента рекурсивного шаблона - PullRequest
0 голосов
/ 24 мая 2018

Я привык к такому коду в Delphi / Lazarus:

type
    TPair<TKey, TValue> = record
        Key:TKey;
        Value:TValue;
    end;
    TAbstractList<T> = class
    end;
    TAbstractPairList<TKey, TValue> = class(TAbstractList<TPair<TKey, TValue>>)
    end;

И я подумал, что шаблоны в C ++ еще более мощные.Но ...

#include <stdio.h>

template <class TKey, class TValue>
struct TPair
{
    TKey Key;
    TValue Value;
};

template <class T>
class TAbstractList
{
    public:
    virtual void DoSomething() = 0;
};

template <class T>
class TList:public virtual TAbstractList<T>
{
    public:
    virtual void DoSomething() {
        printf("%s", "Implementation!");
    };
};

template <class TKey, class TValue>
class TAbstractPairList:public virtual TAbstractList<TPair<TKey, TValue>>
{

};

template <class TKey, class TValue>
class TPairList:public virtual TAbstractPairList<TKey, TValue>,
                       virtual TList<TPair<TKey, TValue>>
{

};

TAbstractPairList<int, int> *List;

int main()
{
    List = new TPairList<int, int>;
    List->DoSomething();
    delete List;
};

Этот код компилируется в онлайн-компиляторах C ++, например https://www.onlinegdb.com,, но не компилируется в реальном, как Borland C ++ Builder.

Т.е. этотработает:

typedef TPair<int, int> TMyPair;
TAbstractList<TMyPair> *List;

Но это не так:

TAbstractList<TPair<int, int>> *List;

И я не могу поместить "typedef" где-то между "шаблоном" и "классом".

Что не так с этим кодом?Почему рекурсивные аргументы шаблона невозможны в некоторых компиляторах C ++?Можно ли как-то решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...