Я привык к такому коду в 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 ++?Можно ли как-то решить эту проблему?